据我所知,如果输入属性发生变化,那么更改检测将触发OnPush标记的组件(还有其他方式)。
但我的子组件中没有输入属性,并且我将一个服务注入到我的组件中。我订阅了此子组件中的服务所公开的observable。现在在subscribe回调方法中,我改变了我的一个子组件的私有属性的值。组件的模板绑定到此属性。
所以问题是当观察者发布一个事件时我的订阅者回调被调用,并且它改变了属性值,但视图并没有反映出这些变化。当我单击页面中的某个位置时,UI才会更新。
changeDetection: ChangeDetectionStrategy.OnPush
更新1:Plunker已添加
答案 0 :(得分:2)
所以,评论是完全正确的。 markForCheck()
会让它升级到根,但这不是一件坏事......
如果您的应用转到:Range
并且您对root > section > page > area > row > list
进行了更改,那么您可能希望通知父项已发生更改。也许你需要在加载更多数据或触发滚动或各种各样的东西时变大。
请记住,您必须等待勾选,如果您在父母身上使用list
而未通知孩子已因onPush()
更改了检测将永远不会到达您的孩子,这就是为什么它一路走来。
另一种方法是使用detectChanges()
手动触发。这将仅在本地组件上运行,并将调用markForCheck()
的节点视为根...
此外,如果您要显示组件的任何属性,那么它在技术上并不是私有的。 Javascript将允许它当然,但测试套件,我认为即使编译器会抱怨。如果你必须做任何事情,用公共吸气剂显示它......就像这样:
detectChanges()