【发布时间】:2019-03-13 13:54:07
【问题描述】:
最初我的父组件与子组件没有任何关系。只是一个元素列表。但是当用户单击列表子组件加载时。然后我可以使用@ViewChild 从父级调用子组件的方法。但这最初不起作用,因为最初没有父子关系。我该如何解决这个问题。
【问题讨论】:
标签: angular dom parent-child communication
最初我的父组件与子组件没有任何关系。只是一个元素列表。但是当用户单击列表子组件加载时。然后我可以使用@ViewChild 从父级调用子组件的方法。但这最初不起作用,因为最初没有父子关系。我该如何解决这个问题。
【问题讨论】:
标签: angular dom parent-child communication
我认为你可以使用 EventEmitter1。在组件中,您可以在加载时发出任何消息。在另一个组件中你可以订阅事件发射器。
【讨论】:
您可以使用@ViewChildren,它非常相似,但也适用于在AfterViewInit 生命周期挂钩之前尚不存在的元素。另外,它将您的元素包装在QueryList 中。
QueryList 确实有一个 changes 属性,这是一个你可以订阅的 observable。实现可能如下所示:
export class SomeComponent implements AfterViewInit {
@ViewChildren(ChildComponent) children: QueryList<ChildComponent>;
ngAfterViewInit(): void {
this.children.changes.subscribe(children => {
children.forEach( (child: ChildComponent) => {
child.somePublicMethod();
});
});
}
}
【讨论】:
我使用@input() 将值从父级传递给子级并使用了
ngOnChanges (changes: SimpleChanges) {
for (let propName in changes) {
let change = changes[propName];
console.log(change);
}
}
ngOnChanges 订阅更改并存储当前值和先前值的位置
【讨论】: