ChangeDetectorRef 中的 markForCheck 与 detectChanges
- 有些人对这两个方法不知道啥时候用,反正一个一个尝试,显示对了就行
markForCheck
- 变更检测的策略为
ChangeDetectionStrategy.OnPush
- 在
自动检测
范围内(angular zone),处于非稳定变更(ngZone.onUnstable
)中
- 这时如果进行了一个修改,那么使用这个方法就可以进行变更
detectChanges
- 变更检测的策略为哪个都行
- 不处于
自动检测
的范围(<root> zone
)内
- 这时如果进行了一个修改,那么使用这个方法就可以进行变更
async 为什么能在ChangeDetectionStrategy.OnPush
中使用
- async 本质上是一个异步(
Promise
/Observable
),使用后当获得值,会调用markForCheck
,而获得值后,正好会进行自动检测
(因为异步),所以哪怕是OnPush
下,也会刷新
切换为ChangeDetectionStrategy.OnPush
后,哪些行为可以触发检测?
- 域内异步结束+markForCheck 可以触发
- 如果父组件触发了检测,那么父组件的值变更传给子组件时,子组件会触发检测
如果变更检测未发生,如何排查
查看变更检测策略
OnPush
默认
查看异步回调 zoneZone.current.name
<root>
angular
可能就是单纯你写的问题