Angular 2 Change检测:OnPush

时间:2017-04-30 20:10:36

标签: angular angular2-changedetection

据我所知,如果输入属性发生变化,那么更改检测将触发OnPush标记的组件(还有其他方式)。

但我的子组件中没有输入属性,并且我将一个服务注入到我的组件中。我订阅了此子组件中的服务所公开的observable。现在在subscribe回调方法中,我改变了我的一个子组件的私有属性的值。组件的模板绑定到此属性。

所以问题是当观察者发布一个事件时我的订阅者回调被调用,并且它改变了属性值,但视图并没有反映出这些变化。当我单击页面中的某个位置时,UI才会更新。

changeDetection: ChangeDetectionStrategy.OnPush

更新1:Plunker已添加

1 个答案:

答案 0 :(得分:2)

所以,评论是完全正确的。 markForCheck()会让它升级到根,但这不是一件坏事......

如果您的应用转到:Range并且您对root > section > page > area > row > list进行了更改,那么您可能希望通知父项已发生更改。也许你需要在加载更多数据或触发滚动或各种各样的东西时变大。

请记住,您必须等待勾选,如果您在父母身上使用list而未通知孩子已因onPush()更改了检测将永远不会到达您的孩子,这就是为什么它一路走来。

另一种方法是使用detectChanges()手动触发。这将仅在本地组件上运行,并将调用markForCheck()的节点视为根...

此外,如果您要显示组件的任何属性,那么它在技术上并不是私有的。 Javascript将允许它当然,但测试套件,我认为即使编译器会抱怨。如果你必须做任何事情,用公共吸气剂显示它......就像这样:

detectChanges()