在DoCheck之后,角度无法检测角度2输入的属性变化

时间:2016-07-08 15:00:29

标签: typescript angular

我使用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]);

     }
    }
}

2 个答案:

答案 0 :(得分:2)

默认情况下,当对象引用发生更改时,更改检测不会检测对象或数组中的更新。

如果您想绕过此行为,请像您一样使用ngDoCheck是正确的做法。在你的情况下,这是正常的行为:

  • 您可以使用IterableDiffers
  • 从ngDoCheck方法收听数组更新
  • ngOnChanges方法未被调用,因为它是由默认更改检测器(检测对象引用更改)触发的。

否则,请从doc:

获取您的信息
  

请注意,指令通常不应使用DoCheck和OnChanges来响应同一输入的更改。当默认更改检测器检测到更改时,将继续调用ngOnChanges,因此通常不需要响应两个挂钩中相同输入的更改。必须在ngDoCheck回调中处理对更改的反应。

答案 1 :(得分:2)

添加或删除阵列时,不会触发更改检测。这是因为数组引用不会更改。 (所以只是添加一些东西或删除一些东西不会"根据变化检测更改"数组)。

如果您希望更改检测通知这些更改,则需要更改对数组的引用。例如,我能想到的最简单方法是在数组上使用array.slice。此方法调用将返回一个新数组,如果您将旧数组分配给该数组,则将有一个新引用,并且更改检测将注意到这一点。