gpt4 book ai didi

Angular ViewChildren 不会立即看到 ngFor 中的所有 child

转载 作者:行者123 更新时间:2023-12-03 23:15:33 27 4
gpt4 key购买 nike

我有一个奇怪的@ViewChildren 行为,对应于 ngFor 生成的子组件。 @ViewChildren 查询在很长一段时间内都看不到数组中的元素。我所有的代码都在 Plunker - 打开控制台查看。

这是我的主要组成部分:

@Component({
selector: 'my-app',
template: `
<button (click)="addInternalComponent()">Add internal component</button>
<app-internal #internals *ngFor="let i of indexes" [index]="i
(afterViewInit)="onAfterViewInit()"></app-internal>
`,
})
export class App {
@ViewChildren('internals') internals: QueryList<InternalComponent>;
indexes = [];
addInternalComponent() {
console.log('adding internal component!');
this.indexes.push(this.indexes.length);
console.log('Not complete list', this.internals._results);

}

onAfterViewInit() {
console.log('onAfterViewInit - still not complete list', this.internals._results);
}
}

其中有我们可以通过单击按钮添加的子组件。

在将元素添加到在 ngFor 循环中生成所有子项的索引数组中之后 - 我们没有刚刚添加的那个。

我可以理解这种行为 - 因为也许子组件需要一些时间来创建它并且引擎决定在创建完整的子组件之前控制台日志。

但是,我在子组件中创建了发射器,表明子组件的 View 和模型都已初始化。但是......在父组件中处理这个事件 - 我们仍然没有这个项目。这怎么可能?

子组件:
export class InternalComponent implements AfterViewInit {
@Input()
index;
@Output()
afterViewInit: EventEmitter<any> = new EventEmitter<any>();

ngAfterViewInit() {
this.afterViewInit.emit();
}

}

最佳答案

被通知的标准方式是 QueryList 的内容已更改是订阅其changes事件在 ngAfterViewInit :

@ViewChildren("internals") internals: QueryList<InternalComponent>;

ngAfterViewInit() {
this.internals.changes.subscribe((list: QueryList<InternalComponent>) => {
// The updated QueryList is available here (with list or with this.internals)
this.doSomethingWithInternals(list);
this.doSomethingWithNewInternal(list.last);
...
});
}

上面的事件处理可能就是你所需要的。如果你还想实现 afterViewInit事件在 InternalComponent ,您可以将组件的引用作为事件的参数传递:
export class InternalComponent implements AfterViewInit {
@Output() afterViewInit = new EventEmitter<InternalComponent>();

ngAfterViewInit() {
this.afterViewInit.emit(this);
}

}
并在事件处理程序中检索组件:
(afterViewInit)="onAfterViewInit($event)"

onAfterViewInit(component: InternalComponent) {
this.useNewInternalComponent(component);
...
}

关于Angular ViewChildren 不会立即看到 ngFor 中的所有 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51729355/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com