在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()手动触发变化检测。

这样解释应该很清楚了!

提示:OnPush配合Immutable.js使用效果更佳!

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

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

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

  1. angular 2+ 变化检测系列二(检测策略)

    我们将创建一个简单的MovieApp来显示有关一部电影的信息.这个应用程序将只包含两个组件:显示有关电影的信息的MovieComponent和包含执行某些操作按钮的电影引用的AppComponent. ...

  2. angular 2+ 变化检测系列一(基础概念)

    什么是变化检测? 变化检测的基本功能就是获取应用程序的内部状态(state),并且是将这种状态对用户界面保持可见.状态可以是javascript中的任何的数据结构,比如对象,数组,(数字,布尔,字符串 ...

  3. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  4. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  5. HBase 的MOB压缩分区策略介绍

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zNZQhb07Nr/article/details/79832392 HBase应用场景很广泛.社区 ...

  6. 【组策略】1.组策略介绍group policy

    组策略介绍group policy 高效学习法,念念不忘,必有回响. 分享一个高效学习思维,潜意识思考.就是在您没有大量时间的情况下,学习十分钟. 然后离开去完成别的事情的时候,大脑潜意识中还会继续思 ...

  7. Angular中ngCookies模块介绍

    1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短 ...

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

    在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者 ...

  9. angular 2+ 变化检测系列三(Zone.js在Angular中的应用)

    在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...

随机推荐

  1. Vue知识整理1:$watch方法的使用

    如下图所示:vue中,可以使用$watch方法显示变量的前面值和当前值,方便进行判断.使用方法: vm.$watch('a',function(newval,oldval){ ...... })

  2. jmeter之自动重定向和跟随重定向用法

    jmeter工具里面有自动重定向和跟随重定向这2种选择,那么他们到底有啥区别呢? 目录 1.自动重定向和跟随重定向 2.举个例子 1.自动重定向和跟随重定向 01.3XX的请求一般要使用跟随重定向,2 ...

  3. python正则表达式整理

    正则表达式在处理字符串时很大的作用,爬虫中也经常用到,下面就将一些常用正则表达式做一整理记录,方便以后查看. ^d   表示匹配以d开头的字符串 .      表示匹配任意字符串 *     表示前面 ...

  4. oracle--增删改、表备份、集合运算

    truncate 插入数据学习及数据的备份 单表查询语句(select) 1.插入数据(insert) 1.语法规范 insert into 表名(字段1,字段2,字段3,....)values('值 ...

  5. Redis功能迅速回忆

  6. [Python3 填坑] 007 多才多艺的 len()

    目录 1. print( 坑的信息 ) 2. 开始填坑 (1) 总的来说 (2) 举例说明 (3) 后记 1. print( 坑的信息 ) 挖坑时间:2019/01/10 明细 坑的编码 内容 Py0 ...

  7. JAVA总结--jvm

    VM,Virtual Machine 即虚拟机,指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. JVM,Java Virtual Machine 即Java虚拟机, ...

  8. Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退

    1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...

  9. hdu-1281.棋盘游戏(二分图匹配 + 二分图关键点查询)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. [常用类]时间内Date、SimpleDateFormat、Calendar类

    Date类的概述是util包下的,不能导入sql包的.* 类 Date 表示特定的瞬间,精确到毫秒. *构造方法 * public Date() * public Date(long date) 如果 ...