使用OnPush时,为什么变异数据会反映在父组件中?

时间:2017-10-09 14:41:13

标签: angular

我试图理解ChangeDetectionStrategy.OnPush是如何运作的。在many tutorials人们说当组件具有OnPush策略时,组件仅依赖于输入,并且组件的子树也会发生更改检测,对象是传递给对象的子组件具有相同的参考。

从我的测试来看,它就是这样的。但是我想知道为什么对象的修改仍然反映在父组件中,即使它们也有OnPush策略?看起来组件正在调用类似markForCheck的内容,并且父组件被标记为运行更改检测。

但为什么呢?是不是OnPush应该用来告诉这个组件只依赖于父组件的输入属性?如果此组件也是OnPush组件,为什么要更改父组件的检测?

Here是我的示例应用。当我单击 changeDataImmutable 时,子组件中的所有数据都会更改,因为已创建新对象。但是,当我单击 changeDataMutable 时,子组件不会更改。 但是,当我单击 modifyX modifyY 时会改变一些深层嵌套的属性,那么这些更改仍会反映在父组件(组件1)中。为什么呢?

1 个答案:

答案 0 :(得分:2)

  

但我想知道为什么对象的修改仍然会反映出来   父组件,即使他们也有OnPush策略?

这是因为您使用了特别是click的事件:

 <button (click)="changeDataImmutable()">changeDataImmutable</button>

所有本机事件都标记当前组件及其所有祖先以进行一次检查。因此,当Angular运行更改检测Component1时,其状态为checksEnabled,因此执行DOM更新。

有关变化检测的最全面解释,请阅读:

要详细了解markForCheck,请参阅this answer并阅读本文: