【问题标题】:Angular 2 input propery changes is not detect by angular after DoCheck在 DoCheck 之后,Angular 2 输入属性更改不会被 Angular 检测到
【发布时间】:2016-11-11 05:00:49
【问题描述】:

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

     }
    }
}

【问题讨论】:

  • 是不是换数组的时候没有体现出来的问题?
  • 是的。我有数组 - 项目并通过 *ngFor 对其进行迭代。在这个 ngFor 我有子组件(你可以在上面看到他的代码)并且它工作正常。但是当我更改这些项目的长度时,我没有像没有 DoCheck 那样正常重新渲染我的子组件(*ngFor 重新迭代正确)但是组件不启动他的 OnInit 等。我不明白为什么和我该如何与之抗争。

标签: typescript angular


【解决方案1】:

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

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

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

否则,请从文档中获取信息:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答。但是我设置了一个新数组this.schedulersData = [this.schedulersData[schedIndex]]。它应该启动更改检测。 NgFor 正确渲染它,但组件本身不会触发 ngOnInit。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2016-03-26
    • 2019-11-23
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2017-11-11
    相关资源
    最近更新 更多