深度嵌套对象的角度2变化检测

时间:2016-05-05 05:00:13

标签: angularjs typescript angular

我在Angular 2中使用变化检测来监视深层数组中的变化。请看这个plunker ......

http://plnkr.co/edit/zcl9pT?p=preview

在没有使用changeDetectionStrategy的情况下,有没有做我正在做的事情?它似乎有点过分,不得不在父组件中注入它。我真的只需要它来循环选择过滤器列表的指令。

 @Component({
  selector: 'hello-world',
  templateUrl: 'src/hello_world.html',
  providers: [MyService],
  pipes: [keyValueFilterPipe, ValuesPipe, AsyncPipe],
  directives: [MyDirective, MyDirective2],
  changeDetection: ChangeDetectionStrategy.CheckAlways
})
export class HelloWorld {

    constructor(){}

  }
}

1 个答案:

答案 0 :(得分:1)

更新:这个错误已在beta17中修复,正如@yurzui指出的那样。 http://plnkr.co/edit/SwbjKn2M9NBBOYD29IML?p=preview

相关公关:https://github.com/angular/angular/commit/42231f5

它允许开发模式下的所有合法程序。

  

checkNoChanges函数仅比较基元类型的相等性,并深入比较迭代。其他对象不能导致checkNoChanges抛出。这意味着开发模式永远不会因为合法程序而失败,但可能允许一些非法程序。

原始答案

问题在于管道的实施。每次keyValueFilterPipe返回一个新的JavaScript对象时,都与同一个过滤器返回的最后一个不同。 Angular认为这是你的代码中的一个错误并且停止工作。

您可以在... has changed after it was checked等控制台中看到报告的错误。不仅你的指令停止工作,普通的文本绑定也会中断。

开发模式下的Angular2将尝试找出在其检查过程中发生的变化"脏检查"。因此,如果开发人员错误地将循环调用放入模板中,Angular将报告该情况。

这是Angular2中的一项功能。但它会伤害你。

解决方案很简单。要么像你一样改变检测策略。或致电enableProd以取消警告。或者实现始终返回固定对象的keyValueFilter(例如WeakMap)。

另见

http://www.bennadel.com/blog/3040-i-have-a-fundamental-misunderstanding-of-change-detection-in-angular-2-beta-8.htm

和Angular的原始问题,尤其是这个评论

https://github.com/angular/angular/issues/5918#issuecomment-167422071