我使用DoCheck来检测从ngFor传递的输入属性中的重要更改。它正常工作。但是当我做了一些更改(从通过ngFor迭代的数组中删除一个项目)时,我的子组件看不到任何更改,也没有重新呈现。
也许我做错了什么?
ngDoCheck() {
console.log('zz');
var changes = this._differ.diff(this.schedulerData);
console.log(changes);
if(changes) {
changes.forEachAddedItem(r => {
console.log(r);
if (r.key === 'tasks') this.launchScheduler();
});
}
}
ngOnInit() {
console.log(this.schedulerData);
} /* !ngOnInit */
ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
for (let propName in changes) {
if (propName === 'schedulerData') {
console.log(changes[propName]);
}
}
}
答案 0 :(得分:2)
默认情况下,当对象引用发生更改时,更改检测不会检测对象或数组中的更新。
如果您想绕过此行为,请像您一样使用ngDoCheck
是正确的做法。在你的情况下,这是正常的行为:
IterableDiffers
类ngOnChanges
方法未被调用,因为它是由默认更改检测器(检测对象引用更改)触发的。否则,请从doc:
获取您的信息请注意,指令通常不应使用DoCheck和OnChanges来响应同一输入的更改。当默认更改检测器检测到更改时,将继续调用ngOnChanges,因此通常不需要响应两个挂钩中相同输入的更改。必须在ngDoCheck回调中处理对更改的反应。
答案 1 :(得分:2)
添加或删除阵列时,不会触发更改检测。这是因为数组引用不会更改。 (所以只是添加一些东西或删除一些东西不会"根据变化检测更改"数组)。
如果您希望更改检测通知这些更改,则需要更改对数组的引用。例如,我能想到的最简单方法是在数组上使用array.slice
。此方法调用将返回一个新数组,如果您将旧数组分配给该数组,则将有一个新引用,并且更改检测将注意到这一点。