25

我是Angular2的新手。在我看来,我几乎没有在 *ngFor 中生成相同的孩子。

<ngb-panel *ngFor="let client of clients" [title]="'Client #' + client.id">
    <template ngbPanelContent>
        <processing-item [client]="client"></processing-item>
    </template>
</ngb-panel>

我需要在父元素中调用这些组件的方法并找出 ViewChildren 装饰器,代码是:

@ViewChildren(ProcessingItemComponent) processingItems: QueryList<ProcessingItemComponent>;

然后我尝试通过 forEach 迭代它们:

ngAfterViewInit() {
    this.processingItems.forEach(function (el) {
        console.log(el);
    });
}

但它什么也没做。在 QueryList 上调用的 toArray() 方法返回空数组。

有什么建议可以一次获取所有子组件并调用其方法吗?

4

2 回答 2

39

如果clients从异步调用(例如到服务器)中设置,则元素尚不存在ngAfterViewInit()

您可以使用

ngAfterViewInit() {
  this.processingItems.changes.subscribe(() => {
    this.processingItems.toArray().forEach(el => {
        console.log(el);
    });
  });
}

另请参阅https://angular.io/api/core/QueryList#changes

于 2017-08-16T09:46:14.107 回答
1

我认为您应该使用 @ContentChildren 属性而不是 ViewChildren。

@ContentChildren( OptionComponent )
public Options: QueryList<OptionComponent>;
于 2018-09-06T15:27:30.833 回答