我有以下应用根:
@Component({
selector: 'my-app',
providers: [],
templateUrl: `<button (click)="callChildFunction()">Close</button>
<router-outlet></router-outlet>`
})
export class AppComponent {
constructor() {
}
callChildFunction(){
// Call myFunction() here
}
}
这是我的孩子(router-outlet
中使用的组件):
@Component({
selector: 'child',
providers: [],
templateUrl: `<div>Hello World</div>`
})
export class ChildComponent {
constructor() {
}
myFunction(){
console.log('success');
}
}
我发现我可以使用RouterOutlet来获取组件功能,但它似乎无法从应用程序根目录中访问。
如何从应用根调用myFunction()
?
答案 0 :(得分:27)
同样使用activate
事件。
每当我们在路由器插座中加载一个组件时,就会发出一个激活事件,利用它来获取组件引用并调用相应的方法。
父组件
<div class="container">
<router-outlet (activate)="onActivate($event)"></router-outlet>
</div>
模板
onActivate(componentRef){
componentRef.works();
}
儿童比赛
works(){
console.log("works");
}
答案 1 :(得分:3)
路由器插座与路由有关,它与访问子组件方法无关。您必须使用@ViewChild从父级访问子组件功能。您可以找到示例here
<强>更新强>
如果上述情况不是一个可行的解决方案,您可以点击激活事件以获取路由器插座内实例化组件的参考。
来自文档
路由器插座将在实例化新组件时发出激活事件,并在销毁时发出激活事件。
因此,您可以使用这些功能并完成您的工作。您可以看到详细的答案here并且在相同的答案中附加了一个plunker
答案 2 :(得分:0)
@Rahul Singh的一个很好的补充:
确保检查,
返回了哪个组件实例。
(以拉胡尔的例子为准)onActivate(componentRef)
方法,
并且仅在该组件确实具有这种方法的情况下调用works()
。
示例:
onActivate(componentRef){
if(componentRef instanceof ChildWithWorksMethodComponent){
componentRef.works();
return;
}
console.log("This is not the ChildWithWorksMethodComponent");
}
否则,每当您导航到某个路线时,哪个组件没有这种方法,您的控制台日志将充满错误,如:
错误TypeError:componentRef.works不是函数