从 parent 访问路由器出口组件

Access router outlet component from parent

我有以下应用根目录:

@Component({
    selector: 'my-app',
    providers: [],
    templateUrl: `<button (click)="callChildFunction()">Close</button>
                  <router-outlet></router-outlet>`
})
export class AppComponent {

    constructor() {

    }

    callChildFunction(){
        // Call myFunction() here
    }

}

这是我的 child(router-outlet 中使用的组件):

@Component({
    selector: 'child',
    providers: [],
    templateUrl: `<div>Hello World</div>`
})
export class ChildComponent {

    constructor() {

    }

    myFunction(){
        console.log('success');
    }

}

我发现我可以使用 RouterOutlet 来获取组件功能,但它似乎无法从应用程序根目录中访问。

如何从应用根目录调用 myFunction()

Router-outlet 与路由相关,与访问子组件无关methods.You访问子组件功能必须使用@ViewChild,parent.You可以找到例子here

更新

如果以上在您的情况下不是可行的解决方案,您可以利用激活事件来获取路由器插座内实例化组件的引用。

来自文档

A router outlet will emit an activate event any time a new component is being instantiated, and a deactivate event when it is being destroyed.

因此您可以使用这些功能并完成您的工作 done.You 可以看到详尽的答案 并且在同一答案中附有一个 plunker

利用 activate 相同的事件。 每当我们在路由器出口加载一个组件时,都会发出一个激活事件,利用它来获取组件引用并调用相应的方法。

父组件

  <div class="container">
    <router-outlet (activate)="onActivate($event)"></router-outlet>
  </div>

模板

  onActivate(componentRef){
    componentRef.works();
  }

儿童比赛

 works(){
    console.log("works");
  }

@Rahul Singh 的一个小补充:

请务必检查
中返回了哪个组件实例 (以 Rahul 为例)onActivate(componentRef) 方法,
并且只调用works(),如果那个组件确实有这样的方法

示例:

     onActivate(componentRef){
       if(componentRef instanceof ChildWithWorksMethodComponent){
         componentRef.works();
         return;
         }
         console.log("This is not the ChildWithWorksMethodComponent");
      }  

否则,每次导航到路由时,哪个组件没有这样的方法,您的控制台日志将充满错误,如:

ERROR TypeError: componentRef.works is not a function

更多信息,您也可以访问 ChildComponent 的变量。

儿童比赛

export class ChildComponent {
    my_var= true;
}   

父组件

// 模板

<div class="container">
    <router-outlet (activate)="onActivate($event)"></router-outlet>
  </div>


  onActivate(componentRef){
    console.log(componentRef.my_var);
  }