angular - 如何使用服务调用孙组件中的函数
问题描述
完整代码示例:https ://stackblitz.com/edit/angular-iphgxf
如何从孙子组件访问方法?我正在尝试使用服务来解决此问题,但鉴于以下情况,我不知道如何对其进行最后润色:
如果有未保存的数据( https://angular.io/guide/router#candeactivate-handling-unsaved-changes),我正在尝试实现 CanDeactivateGuard 以防止用户导航离开页面。我在本指南中使用了相同的方法,其中我的页面组件中有一个 canDeactivate 方法,该方法由警卫的 canDeactivate 方法调用。
我的问题是我的 entity/:id 路由的组件是一个容器组件,而我保存表单数据的表示组件是路由组件的孙子。我需要访问 canDeactivate() 逻辑的实体详细信息组件中的表单。我需要我的路由组件的 canDeactivate 函数来访问实体详细信息组件上的另一个 canDeactivate 函数或访问表单数据以执行验证。
我正在为我的 entity/:id 路由(映射到 view-entity-page)使用与 @ngrx example-app(参见 book 模块)类似的架构,其中我有一个 view-entity-page 容器组件负责映射路由器参数到@ngrx/store 中的“选择”实体操作。这个组件有一个子组件,selected-entity-page,它负责与@ngrx/store 一起将实体数据传递给实际的表示组件entity-detail。这可能有点矫枉过正,但这是我现在所拥有的......
解决方案
遵循容器模式,您可以在孙子中定义一个输出属性(事件),以在数据更改时通知其父级。然后,该父(子)还需要定义一个通知其父(祖父)的输出属性(事件)。这样,祖父母就可以获得路线守卫所需的信息。
另一种方法是将“dataChanged”属性添加到存储中,以便孩子可以调度操作并设置该属性。然后守卫可以从存储中读取数据,或者祖父母可以从存储中读取数据并将其提供给守卫。
推荐阅读
- python - 更新了 python3 现在终端无法启动
- django - 我想删除 wagtail cms 中的模型
- c++ - 纸牌游戏中的结构向量在之后不显示纸牌,不确定是否创建了套牌
- c# - 如何将组件数据绑定到两个或多个不同方向的属性?
- python - Python Pandas 在数据框中间添加空列
- php - 替代 fopen 和 include 用于打开和从 txt 文件中选择
- swift - NSCameraUsageDescription 在启动代理、OS Mojave 上崩溃
- python-3.x - Pandas 数据框转置列名而不是索引
- python - 如果组中的任何一行包含某个值,则创建一个新列并分配值
- c# - 如何在 C# 7.0 中使用 CodeContracts?