在Angular 2中,当使用ngFor循环创建组件列表时,ngDestroy方法只会在组件被销毁时被调用。如果ngFor循环中的组件引用发生变化,ngDestroy方法不会被调用。这是因为ngFor循环是基于对象引用的,而不是基于对象属性的。
但是,你可以通过使用trackBy函数来解决这个问题。trackBy函数可以告诉Angular如何跟踪和比较对象。
下面是一个示例代码:
@Component({
selector: 'app-item',
template: `
{{ item.name }}
`
})
export class ItemComponent implements OnDestroy {
@Input() item: any;
ngOnDestroy() {
console.log('ngDestroy called');
}
}
@Component({
selector: 'app-list',
template: `
`
})
export class ListComponent {
items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
];
trackByFn(index, item) {
return item.id; // 返回唯一标识项的属性,例如id
}
changeItems() {
this.items = [
{ id: 4, name: 'Item 4' },
{ id: 5, name: 'Item 5' },
{ id: 6, name: 'Item 6' }
];
}
}
在上面的示例中,我们创建了一个ItemComponent和一个ListComponent。ListComponent中有一个items数组,通过ngFor循环创建了ItemComponent的实例。在trackByFn函数中,我们返回了每个item对象的id属性作为唯一标识。这样,当items数组发生变化时,Angular将使用trackBy函数来跟踪和比较对象,如果对象的唯一标识发生变化,ngDestroy方法将被调用。
你可以尝试点击“Change Items”按钮来改变items数组,然后观察控制台中的日志信息。