• 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
  • 相关阅读:
    [转]C# 中使用System.Net.Http.HttpClient 模拟登录博客园
    FastReport.NET 学习笔记--子分组添加事件无效的问题
    FastReport.NET 学习笔记--VS2010工具箱找不到fastreport的问题
    关于C#静态方法调用问题
    单链表——带头节点
    线性表——顺序存储结构
    重新出发
    ThreadPoolExecutor源码学习(1)-- 主要思路
    ThreadPoolExecutor源码学习(2)-- 在thrift中的应用
    [译]Cassandra的数据读写与压缩
  • 原文地址:https://www.cnblogs.com/hjsblogs/p/10418764.html
Copyright © 2020-2023  润新知