使用不可变对象或手动触发变化检测
在Angular中,*ngFor指令通常用于遍历数组并生成相应的DOM元素。但是,当我们对数组进行修改时,视图并不总是会被更新。这是因为Angular默认采用的是引用比较的变化检测策略,而不是深度比较。因此,当我们修改数组时,其实是修改了同一个引用对象的内容,而不是创建了一个新的数组对象,导致变化检测无法触发。
为了解决这个问题,我们可以采用不可变对象的方式,即在修改数组时,创建一个全新的数组对象并赋值给原始数组,以此来触发视图的更新。例如:
this.items = [...this.items, newItem]; //添加新元素
this.items = this.items.filter(item => item != deletedItem); //删除元素
另一种方式是手动触发变化检测。我们可以注入ChangeDetectorRef服务,并调用其detectChanges()方法,以此来强制更新视图。例如:
import {ChangeDetectorRef} from '@angular/core';
constructor(private cdr: ChangeDetectorRef) {}
ngOnInit() {
setInterval(() => {
//修改数组
this.cdr.detectChanges(); //手动触发变化检测
}, 1000);
}
使用这两种方法之一,都可以确保视图正确地根据数组的变化来更新。
∠