从路由加载子组件时从父组件触发子组件方法

Posted

技术标签:

【中文标题】从路由加载子组件时从父组件触发子组件方法【英文标题】:Trigger Child Component Method from Parent Component when child component loaded from the routing 【发布时间】:2018-03-09 19:51:10 【问题描述】:

我创建了一个子组件,它有一个我想在调用父组件方法时执行的方法。

这似乎是重复的问题,如下所示。

Call child component method from parent class - Angular

当我在父组件模板中包含子组件时,这非常有效,例如

<parent-comp> <child-comp></child-comp></parent-comp>.

但是,在我的情况下,我使用路由加载子组件,在这种情况下,我无法执行子方法,因为 viewchild 为 null。

下面是快速启动 Angular 应用程序,其中包含我的更改。

import  Component, ViewChild  from "@angular/core";
import  ItemCompanyComponent  from "../item/Company/ItemCompanyComponent";

@Component(
    moduleId: module.id,
    selector: "item-add",
    templateUrl: "ItemComponent.html"
)
export class ItemComponent 

    @ViewChild(ItemCompanyComponent) public child: ItemCompanyComponent;

    ngAfterViewInit(): void 
        this.save = () =>  
            alert("Item Component Save");
            this.child.childsave();
        
    

    save(): void 

    




@Component(
    moduleId: module.id,
    selector: "item-company",
    templateUrl: "ItemCompanyComponent.html"
)
export class ItemCompanyComponent 
 childsave(): void 
        alert("Item Company Component Save");
    

ItemComponent.html:

<div class="main-content" fxFlex>
            <router-outlet></router-outlet>
        </div>

项目组件中的子属性为空。任何解决方案都非常可观。

【问题讨论】:

【参考方案1】:

使用共享服务与路由器添加的组件进行通信。

您可以使用activate 事件让父级知道路由器何时添加了组件

<router-outlet (activate)="notifyChild()"></router-outlet>

【讨论】:

我有近 20 个子组件。它们将通过路由加载。所以当我点击父组件中的保存时,需要调用加载的子组件保存。有了这个(活动的)事件发射器,这可能实现吗?如果没有,我怎么能做到? Active 仅通知您添加了一个组件。如果您想通知“保存”,似乎不需要使用(activate)="..."。其余的可以使用共享服务来完成。关于使用共享服务进行组件通信的问题大约有 1k 个,angular.io 上的文档也包含“组件通信”部分。 我不认为在这种情况下共享服务是一个好方法。我们还有什么选择? 实际上我认为共享服务是唯一明智的方法(因为如果组件不是直接的父/子或直接兄弟,并且不像路由器那样动态添加,它几乎总是在组件之间进行通信) 好的,如果没有房间开放我会进入这个。感谢您的及时解决。

以上是关于从路由加载子组件时从父组件触发子组件方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从父组件调用路由器出口子组件方法

如何将回调从父组件传递到嵌套路由组件?

vue---vue2.x中父组件事件触发子组件事件

vue父组件点击触发子组件事件的实例讲解

React 功能组件状态变化不会触发子组件重新读取其 props

Angular 2如何将变量从父组件传递到路由器出口