Angular OnPush策略下ChildWrapperComponent为何触发ngDoCheck?
问题解答
核心原因:ngDoCheck()的执行逻辑与OnPush策略无关
不管组件采用默认还是OnPush变更检测策略,只要Angular启动了该组件的变更检测流程,ngDoCheck()钩子就会被调用——哪怕Angular最终跳过了该组件的属性变更检查。
具体场景分析
- 当你在根组件调用
detectChanges()时,Angular会启动整个组件树的变更检测遍历,ChildWrapperComponent作为根组件的子组件,会被纳入这个遍历流程。 - 对于
OnPush策略的组件,Angular会先判断是否满足变更触发条件(比如输入属性引用变化、组件自身触发事件、手动调用markForCheck()等)。如果不满足,Angular会跳过组件的属性变更检查以及其内部子组件的变更检测,但ngDoCheck()作为变更检测生命周期的固定环节,依然会被执行。 ngDoCheck()的设计目的就是允许开发者在Angular默认变更检测覆盖不到的场景中,自定义变更检测逻辑,因此它的执行时机绑定的是变更检测流程的启动,而非属性检查的结果。
内容的提问来源于stack exchange,提问作者michalgrzegorczyk-dev
相关产品推荐
相关产品推荐

