美文网首页
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

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