我在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(){}
}
}
答案 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
)。
另见
和Angular的原始问题,尤其是这个评论
https://github.com/angular/angular/issues/5918#issuecomment-167422071