【问题标题】:How to use a service to call a function in a grandchild component如何使用服务调用孙组件中的函数
【发布时间】:2018-08-03 20:00:40
【问题描述】:

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

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

我正在尝试实现 CanDeactivateGuard 以防止用户在存在未保存数据时离开页面 (https://angular.io/guide/router#candeactivate-handling-unsaved-changes)。我在本指南中使用了相同的方法,其中我的页面组件中有一个 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。这可能有点矫枉过正,但这是我现在所拥有的......

【问题讨论】:

  • 路由组件负责知道用户是否可以离开路由。我想您将不得不通过将它们注入父组件来委托给子组件。 (@ViewChild(ComponentType) child: ComponentType)。替代方法是将“未更改”表单状态保留在服务中,该服务将在来自孙子的每个输入事件上调用,或者将其保持在您的应用程序状态(ngrx 存储)。

标签: angular rxjs ngrx


【解决方案1】:

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

另一种方法是将“dataChanged”属性添加到存储中,以便孩子可以调度操作并设置该属性。然后守卫可以从存储中读取数据,或者祖父母可以从存储中读取数据并将其提供给守卫。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2016-07-18
    • 2020-12-12
    • 2019-01-20
    • 2017-08-10
    • 1970-01-01
    • 2012-12-19
    • 2017-04-10
    相关资源
    最近更新 更多