【发布时间】:2017-09-28 09:08:53
【问题描述】:
我知道如果输入属性发生变化(还有其他方式),则会为 OnPush 标记的组件触发变化检测。
但是我的子组件中没有输入属性,并且我的组件中注入了一个服务。我已经订阅了这个子组件内的服务公开的 observable。现在在订阅回调方法中,我更改了我的子组件的私有属性之一的值。组件的模板与此属性绑定。
所以问题是当观察者发布一个事件时,我的订阅者回调被调用,它改变了属性值,但视图没有反映这些变化。仅当我单击页面中的某个位置时,UI 才会更新。
changeDetection: ChangeDetectionStrategy.OnPush
更新 1:添加了Plunker
【问题讨论】:
-
您是否尝试过使用异步管道或
cdRef.markForCheck()?你的代码在哪里? -
我不能使用异步管道,因为我的模板绑定到组件的私有属性,例如字符串。我读过 CDR.markForCheck() ,但这不是矫枉过正,因为它会通过触发 CD 回到祖先根组件?我不知道如何发布一个plunker,将谷歌并很快添加。谢谢。
-
不,
markForCheck不会回到祖先根。那是ApplicationRef.tick()。markForCheck使组件在下一个更改检测轮次中不被跳过。 -
实际上我经历了这个,答案的最后一段说它会一直触发到 root stackoverflow.com/questions/35386822/…
-
不要绑定到私有属性 - 它不兼容 AOT。
标签: angular angular2-changedetection