如何使用服务在孙子组件中调用函数

时间:2018-08-03 20:00:40

标签: angular rxjs ngrx

完整代码示例:https://stackblitz.com/edit/angular-iphgxf

如何从孙子组件访问方法?我正在尝试使用服务来解决此问题,但是鉴于以下情况,我不知道如何对其进行最后润饰:

我正在尝试实现CanDeactivateGuard,以防止用户在有未保存的数据(https://angular.io/guide/router#candeactivate-handling-unsaved-changes)的情况下离开页面。我在本指南中使用的是同一方法,其中页面组件中有一个canDeactivate方法,该方法由后卫的canDeactivate方法调用。

我的问题是我的object /:id路由的组件是容器组件,而保存表单数据的演示文稿组件是route组件的孙子组件。我需要访问canDeactivate()逻辑的实体详细信息组件中的表单。我需要我的路由组件的canDeactivate函数来访问实体详细信息组件上的另一个canDeactivate函数,或者有权访问表单数据以执行验证。

我对我的entity /:id路由(映射到view-entity-page)使用与@ngrx example-app类似的体系结构(请参见书模块),其中我有一个view-entity-page容器组件负责将路由器参数映射到@ ngrx / store中的“选择”实体操作。该组件作为子级的selected-entity-page,作为子组件,负责与@ ngrx / store一起使用,以将实体数据传递给实际的表示组件,entity-detail。这可能是过大了,但这就是我现在所拥有的...

1 个答案:

答案 0 :(得分:0)

按照容器模式,您可以在孙子项中定义一个输出属性(事件),该子项在数据更改时通知其父项。然后,该父项(子项)还需要定义一个通知其父项(祖父母)的Output属性(事件)。这样,祖父母将拥有路由守卫所需的信息。

另一种方法是将“ dataChanged”属性添加到存储中,以便子级可以分派操作并设置该属性。然后,警卫人员可以从商店中读取数据,或者祖父母可以从商店中读取数据并将其提供给警卫人员。