zoukankan      html  css  js  c++  java
  • angular2 ChangeDetectorRef (变化检测器的引用)手动控制组件的变化检测行为

    Angular检测机制

      监测到异步事件后是怎么判断是否需要更新视图呢?其实比较简单,Angular通过脏检查来判断是否需要更新视图。脏检查其实就是存储所有变量的值,每当可能有变量发生变化需要检查时,就将所有变量的旧值跟新值进行比较,不相等就说明检测到变化,需要更新对应视图。当然,实际情况肯定不是这么简单,Angular会通过自己的算法来对数据进行检查,对算法感兴趣的可以参考这篇文章-Angular的脏检查算法。
      Angular 应用是一个响应系统,首次检测时会检查所有的组件,其他的变化检测则总是从根组件到子组件这样一个从上到下的顺序开始执行,它是一棵线性的有向树,任何数据都是从顶部往底部流动,即单向数据流。

    如何手动执行变更检测

    从@angular/core引入AfterViewInit, ChangeDetectorRef。注入ChangeDetectorRef对象

    constructor(private todoService:TodoService, private cdr: ChangeDetectorRef){}

    它提供了以下方法供我们调用:

    class ChangeDetectorRef {
      markForCheck(): void
      detach(): void
      detectChanges(): void
      checkNoChanges(): void
      reattach(): void
    }
    • markForCheck() - 在组件的 metadata 中如果设置了 changeDetection: ChangeDetectionStrategy.OnPush 条件,那么变化检测不会再次执行,除非手动调用该方法。
      •   
        @Component({
          selector: 'app-refer',
          templateUrl: './refer.component.html',
          styleUrls: ['./refer.component.css'],
          changeDetection: ChangeDetectionStrategy.OnPush
        })
    • detach() - 从变化检测树中分离变化检测器,该组件的变化检测器将不再执行变化检测,除非手动调用 reattach() 方法。
    • reattach() - 重新添加已分离的变化检测器,使得该组件及其子组件都能执行变化检测
    • detectChanges() - 从该组件到各个子组件执行一次变化检测
      手动设置变更检测:
    ref.detach();
    setInterval(() => {
     this.ref.detectChanges();
    }, 5000);

    详情链接:https://www.jianshu.com/p/6bef681a0cae
  • 相关阅读:
    luoguP1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
    luoguP1447 [NOI2010]能量采集
    POJ2559 Largest Rectangle in a Histogram (单调栈
    2038: [2009国家集训队]小Z的袜子(hose)
    codeforces 835C Star sky
    HDU1859 最小长方形 (水
    HDU 1754 I Hate It
    HDU 1698 Just a Hook(线段树
    HDU 1394 Minimum Inversion Number(树状数组/归并排序实现
    HDU1166 敌兵布阵(树状数组实现
  • 原文地址:https://www.cnblogs.com/hjsblogs/p/10418764.html
Copyright © 2011-2022 走看看