我试图理解ChangeDetectionStrategy.OnPush
是如何运作的。在many tutorials人们说当组件具有OnPush
策略时,组件仅依赖于输入,并且组件的子树也会发生更改检测,对象是传递给对象的子组件具有相同的参考。
从我的测试来看,它就是这样的。但是我想知道为什么对象的修改仍然反映在父组件中,即使它们也有OnPush
策略?看起来组件正在调用类似markForCheck的内容,并且父组件被标记为运行更改检测。
但为什么呢?是不是OnPush
应该用来告诉这个组件只依赖于父组件的输入属性?如果此组件也是OnPush
组件,为什么要更改父组件的检测?
Here是我的示例应用。当我单击 changeDataImmutable 时,子组件中的所有数据都会更改,因为已创建新对象。但是,当我单击 changeDataMutable 时,子组件不会更改。 但是,当我单击 modifyX 或 modifyY 时会改变一些深层嵌套的属性,那么这些更改仍会反映在父组件(组件1)中。为什么呢?
答案 0 :(得分:2)
但我想知道为什么对象的修改仍然会反映出来 父组件,即使他们也有OnPush策略?
这是因为您使用了特别是click
的事件:
<button (click)="changeDataImmutable()">changeDataImmutable</button>
所有本机事件都标记当前组件及其所有祖先以进行一次检查。因此,当Angular运行更改检测Component1
时,其状态为checksEnabled
,因此执行DOM更新。
有关变化检测的最全面解释,请阅读:
要详细了解markForCheck
,请参阅this answer并阅读本文: