美文网首页
Angular-ngDoCheck

Angular-ngDoCheck

作者: 小麻烦爱学习 | 来源:发表于2020-07-01 14:37 被阅读0次
钩子 用途 时机
ngDoCheck() 检测,并在发生 Angular 无法不愿意自己检测的变化时作出反应。 欲知详情和范例,参见本文档中的自定义变更检测 紧跟在每次执行变更检测时的 ngOnChanges() 和 首次执行变更检测时的 ngOnInit() 后调用。

无法检测: input输入框的click
不愿意检测: 组件的更新策略设置为OnPush

假如有三个组件,他们的层级关系:
--组件A
--组件B
--组件C

默认变更检测策略Default:
Checking A component:

  • update B input bindings
  • call NgDoCheck on the B component
  • update DOM interpolations for component A

Checking B component:
- update C input bindings
- call NgDoCheck on the C component
- update DOM interpolations for component B

Checking C component:
- update DOM interpolations for component C

OnPush策略:
Checking A component:

  • update B input bindings
  • call NgDoCheck on the B component
  • update DOM interpolations for component A

if (bindings changed) -> checking B component:
- update C input bindings
- call NgDoCheck on the C component
- update DOM interpolations for component B

Checking C component:
- update DOM interpolations for component C

前置条件:假如组件A的数据绑定是个对象,组件B的变更检测策略是OnPush.
触发条件:当组件A中只有对象的属性值变化,那么组件B上不执行变更检测.
结果: 在组件A上执行变更检测时,会更新(update)对组件B的数据绑定(如果只是属性变化,即引用没有变化,不会触发组件B的ngOnChanges),然后调用组件B的ngDoCheck(注意:是在组件A的变更检测时调用),此时可以比较老的数据和新的数据,如果发现数据有变化,调用ChangeDetectionRef实例的markForCheck()方法,触发组件B的变更检测.
ngDoCheck的作用: Angular不愿意检测组件B的变更时(组件B的OnPush),但是数据发生变化,使用ngDoCheck,可以捕获到变化,然后执行操作.

总结:

①一个子组件B的变更检测机制是OnPush
②父组件A的输入属性发生变化但是引用没有变化时,子组件B的变更检测不会执行,但是子组件B的ngDoCheck()会被调用
③ngDoCheck对比数据,发现数据有变化,调用markForCheck()方法,触发子组件的更新

相关文章

  • Angular-ngDoCheck

    钩子用途时机ngDoCheck()检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。 欲知详情...

网友评论

      本文标题:Angular-ngDoCheck

      本文链接:https://www.haomeiwen.com/subject/gdncqktx.html