在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. 后台管理模板ACE

    要做系统,界面展示效果较简单,1个开发人员,无美工,无前端! 以前一直用bootstrap来做界面.这次也走的老路!同样适用的bootstrap界面.做完之后,功能上,我还是比较满意的,兼容IE8+, ...

  2. Spring Boot 之 springcache的使用

    一.开启 springcache,启动类添加 @EnableCaching 注解 @SpringBootApplication @EnableCaching public class Gatherin ...

  3. LeetCode——160 Intersection of Two Linked Lists

    题目 Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 Output: ...

  4. Myeclipse 快捷键大全(绝对全)

    非常感谢分享这篇文章的大虾..但是我忘了几下您的blog地址,因此无法注明原文地址...见谅哈 存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合 ...

  5. 移动端的设备提供了一个事件:orientationChange事件

    移动端的设备提供了一个事件:orientationChange事件:https://blog.csdn.net/gong1422425666/article/details/79001836

  6. Bloxorz I (poj3322) (BFS)

    [题目描述] It's a game about rolling a box to a specific position on a special plane. Precisely, the pla ...

  7. SQLServer查看及设置最大连接数

    很多时候自己本地开发会遇到 ,打开几个连接正常访问 之后就报错误,这时候需要调整sqlserver 最大连接数. 1. 查询最大连接数 SELECT value_in_useFROM sys.conf ...

  8. 《Cascaded Pyramid Network for Multi-Person Pose Estimation》论文阅读及复现笔记

    一.PipeLine 要点 TopDown + GlobalNet + RefineNet 二.Motivation 通过提高对难以识别的关键点的识别准确率,来提升总体识别准确率. 方法:1.refi ...

  9. OpenCV-----Numpy数组

    Nunmpy数组包含: 强大的N维数组对象 复杂的(广播)功能 集成C / C ++和Fortran代码的工具 有用的线性代数,傅立叶变换和随机数功能 遍历与修改数组中的所有像素点 #对所有像素进行循 ...

  10. asp.net中的<% %>,<%= %>,<%# %><%$ %>的使用

    原文:https://www.cnblogs.com/Hackerman/p/3857630.html 首先我们来看一下<% %>的使用 在aspx的页面中只能使用服务器控件和一般的控件, ...