我创建了我的自定义结构指令,该指令应该为传递的项目数组中的每个元素呈现主机元素:
@Directive({
selector: '[appItems]'
})
export class ItemsDirective implements OnInit, OnChanges {
@Input('appItemsOf')
items: any[];
constructor(private container: ViewContainerRef,
private template: TemplateRef<any>) {
}
ngOnInit(): void {
this.container.createEmbeddedView(this.template);
}
ngOnChanges(): void {
this.container.clear();
for (const item of this.items) {
if (item) {
this.container.createEmbeddedView(this.template, {
$implicit: item,
index: this.items.indexOf(item)
});
}
}
}
}
用法:
<div *appItems="let item of items">
Item: {{ item.name }}
</div>
不幸的是,打印:
Item: 1
Item: 2
Item: 3
Item:
最后一个元素正在创建和呈现,尽管项数组如下所示:
items = [
{
name: '1'
},
{
name: '2'
},
{
name: '3'
}
]
我创建了一个显示此问题的 https://stackblitz.com/edit/angular-qwatckstackblitz。
为什么会这样,应该如何正确完成?
目前,已完成以下操作:
- 创建指令实例
- 调用
NgOnChanges
- 调用
NgOnInit
因此,基本上,一旦为集合创建了 N 个视图,就会在NgOninit
期间再创建一个视图,从而在模板中生成 N+1 个嵌入式视图。
只需删除NgOnInit
的内容。
你为什么要在ngOnInit
中创建这个,因为这创造了额外的一个。注释此行后,多余的项目将消失。
ngOnInit(): void {
// this.container.createEmbeddedView(this.template);
}