变更检测答疑

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

  • 看看 markForCheck

默认

  • 看看 zone

查看异步回调 zoneZone.current.name

<root>

  • 查看上下文哪里将空间变更了

angular

  • 看看是否触发是异步,是否触发检测

可能就是单纯你写的问题