Angular:OnPush变化检测策略介绍

在OnPush策略下,Angular不会运行变化检测(Change Detection ),除非组件的input接收到了新值。接收到新值的意思是,input的值或者引用发生了变化。这样听起来不好理解,看例子:

子组件接收一个balls(别想歪:))输入,然后在模板遍历这个balls数组并展示出来。初始化2秒后,往balls数组push一个new ball

//balls-list.component.ts
@Component({
  selector: ‘balls-list‘,
  template: `
    <div *ngFor="let ball of balls">{{ball}}</div>
  `
})
export class BallsList implements OnInit{
  @Input() balls: any[];
  ngOnInit(){
    setTimeout(() => {
      this.balls.push(‘new ball‘);
    },2000)
  }
}

注意:因为鼠标键盘事件会触发变化检测,所以这里使用定时器!

现在是不使用OnPush策略的情况。2秒后,new ball就被添加到视图中了。

当使用OnPush变化检测策略的时候,new ball并不会被添加到视图中:

//balls-list.component.ts
@Component({
  selector: ‘balls-list‘,
  template: `
    <div *ngFor="let ball of balls">{{ball}}</div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class BallsList implements OnInit{
  @Input() balls: any[];
  ngOnInit(){
    setTimeout(() => {
      this.balls.push(‘new ball‘);
    },2000)
  }
}

但是,如果在父组件改变input的值,视图是会更新的,因为这样Angular会运行变化检测:

//app.component.ts
@Component({
  selector: ‘my-app‘,
  template: `
    <balls-list [balls]="balls"></balls-list>
    <button (click)="changeRef()">Change Ref</button>
  `,
})
export class AppComponent implements OnInit{
  balls: any[] = [‘basketball‘,‘football‘];
  ngOnInit(){}
  changeRef(){
    this.balls = [‘baseball‘,‘pingpong‘];
  }
}

这样就相当于改变了balls的引用。

但是,如果不改变balls的引用,只给它push一个值,视图是不会更新的:

//app.component.ts
@Component({
  selector: ‘my-app‘,
  template: `
    <balls-list [balls]="balls"></balls-list>
    <input #input>
    <button (click)="addBall(input.value)">Add a ball</button>
  `,
})
export class AppComponent implements OnInit{
  balls: any[] = [‘basketball‘,‘football‘];
  ngOnInit(){}
  addBall(ball){
    this.balls.push(ball);
  }
}

这时如果有需要,我们可以用ChangeDetectorRef.detectChanges()手动触发变化检测。

这样解释应该很清楚了!

本文代码和演示可以在这里查看(建议电脑访问,自备梯子)。

不当之处欢迎指出,欢迎交流!

原文地址:https://www.cnblogs.com/cme-kai/p/8497146.html

时间: 2024-10-11 21:47:52

Angular:OnPush变化检测策略介绍的相关文章

angular 2+ 变化检测系列一

什么是变化检测? 变化检测的基本功能就是获取应用程序的内部状态(state),并且是将这种状态对用户界面保持可见.状态可以是javascript中的任何的数据结构,比如对象,数组,(数字,布尔,字符串等基础数据类型).这种状态最终可能成为用户界面中的段落,表单,链接或按钮,在web浏览器中我们们称之为文档对象模型(dom).将数据结构作为输入生成dom作为输出并展示给用户,我们称这个过程为渲染. 但是,在运行时发生更改时会变得更加棘手.一段时间后,DOM已经被渲染.我们如何弄清楚模型中发生了哪些

Hive优化策略介绍

作为企业Hadoop应用的核心产品之一,Hive承载着公司95%以上的离线统计,甚至很多企业里的离线统计全由Hive完成: Hive在企业云计算平台发挥的作用和影响越来越大,如何优化提速已经显得至关重要: Hive作业的规模决定着优化层级,一个Hive作业的优化和一万个Hive作业的优化截然不同: 后续文章将从如下三个方面进行hive的优化介绍: 1)  架构方面(高效.全局.局部)----最有效的优化,好的架构能让作业性能提高很多 a)  分表:(日志表量大而且作业访问次数多,造成耗时较长:将

angular中重要指令介绍($eval,$parse和$compile)

在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者就有100个哈姆雷特,我在这里讲讲自己对于他们两个服务的理解. 大家可能会疑问,$eval呢,其实他并不是一个服务,他是scope里面的一个方法,并不能算服务,而且它也基于parse的,所以只能算是$parse的另一种写法而已,我们看一下ng源码中$eval的定义是怎样的就知道了 $eval: fu

Angular中ngCookies模块介绍

1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的.硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的.所以,按存在时间,可分为非持久Cookie和持久Cookie. 主要因为HTTP协议无状态性,服务器需要知道用户在之前的页面做了哪些操作,所欲引入Cookie,是一种解

Polly的多种弹性策略介绍和简单使用

什么是Polly? Polly是一个.NET弹性和瞬态故障处理库.允许我们以非常顺畅和线程安全的方式来执行诸如行重试,断路,超时,故障恢复等策略. Polly项目地址:https://github.com/App-vNext/Polly Polly提供多种弹性策略:重试(Retry),断路器(Circuit-breaker),超时检测(Timeout),缓存(Cache),降级(FallBack) 重试(Retry): 前置条件:许多故障是短暂的,并且可能在短暂延迟后自我纠正 政策如何缓解:允许

详解angular2组件中的变化检测机制(对比angular1的脏检测)

组件和变化检测器 如你所知,Angular 2 应用程序是一颗组件树,而每个组件都有自己的变化检测器,这意味着应用程序也是一颗变化检测器树.顺便说一句,你可能会想.是由谁来生成变化检测器?这是个好问题,它们是由代码生成. Angular 2 编译器为每个组件自动创建变化检测器,而且最终生成的这些代码 JavaScript VM友好代码.这也是为什么新的变化检测是快速的 (相比于 Angular 1.x 的 $digest).基本上,每个组件可以在几毫秒内执行数万次检测.因此你的应用程序可以快速执

成为优秀Angular开发者所需要学习的19件事

一款to-do app基本等同于前端开发的"Hello world".虽然涵盖了创建应用程序的CRUD方面,但它通常只涉及那些框架或库也能做到的皮毛而已. Angular看起来似乎总是在改变和更新 - 但实际上,还是有一些事情仍然保持不变.以下是关于Angular所需要学习的核心概念的概述,以便大家可以正确地利用JavaScript框架. 说到Angular,我们需要学习很多东西,很多人被困在初学者的圈子里,仅仅是因为不知道去哪里搜索或者应该搜索什么关键词.下面我们会说到的这个指南(也

Angular vs React 最全面深入对比

如今,Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角度去比较两者,尽可能的为你在选择时提供更多的参考意见. 选择的方法 在选择之前,我们尝试带着一些问题去审视你将要选择的框架(或者是任何工具),尝试用这些问题的答案来帮助我们更加了解框架,也更加让选择变得更容易 框架本身的问题: 是否成熟?谁在背后支持呢? 具备的功能? 采用什么架构和模式? 生态系统

angular 有关侦测组件变化的 ChangeDetectorRef 对象

我们知道,如果我们绑定了组件数据到视图,例如使用 <p>{{content}}</p>,如果我们在组件中改变了content的值,那么视图也会更新为对应的值. angular 会在我们的组件发生变化的时候,对我们的组件执行变化检测,如果检测到我们的数据发生了变化,就会执行某些操作,如修改绑定数据的时候更新视图. 这样一来,当我们的组件数据比较多的时候,angular就会有很多操作在静悄悄地进行,一个规避这个问题的方法是,设置某个组件的变化检测策略为 'OnPush'. 使用 OnP