浅谈Angular 的变化检测的方法


Posted in Javascript onMarch 01, 2018

Change Detection (变化检测) 是 Angular 2 中最重要的一个特性。当组件中的数据发生变化的时候,Angular 2 能检测到数据变化并自动刷新视图反映出相应的变化。

在介绍变化检测之前,我们要先介绍一下浏览器中渲染的概念,渲染是将模型映射到视图的过程。模型的值可以是 JavaScript 中的原始数据类型、对象、数组或其他数据对象。然而视图可以是页面中的段落、表单、按钮等其他元素,这些页面元素内部使用 DOM(Document Object Model) 来表示,为了更好地理解,我们来看一个具体的示例:

<h4 id="greeting"></h4> <script> document.getElementById("greeting").innerHTML = "Hello World!"; </script>

这个例子很简单,因为模型不会变化,所以页面只会渲染一次。如果数据模型在运行时会不断变化,那么整个过程将变得复杂。因此为了保证数据与视图的同步,页面将会进行多次渲染。接下来我们来考虑一下以下几个问题:

1、什么时候模型会发生变化

2、模型产生了什么变化

3、变化后需要更新的视图区域在哪里

4、怎么更新对应视图区域

而变化检测的基本目的就是解决上述问题。在 Angular 2 中当组件内的模型发生变化的时候,组件内的变化检测器就会检测到更新,然后通知视图刷新。因此变化检测器有两个主要的任务:

1、检测模型的变化

2、通知视图刷新

接下来我们来分析一下什么是变化,变化是怎么产生的。

变化和事件

变化是旧模型与新模型之间的区别,换句话说变化产生了一个新的模型。让我们来看一下下面的代码:

import { Component } from '@angular/core'; @Component({
 selector: 'exe-counter',
 template: `
 <p>当前值:{{ counter }}</p>
 <button (click)="countUp()"> + </button>` }) export class CounterComponent {
 counter = 0;

 countUp() { this.counter++;
 }
}

页面首次渲染完后,计数器的当前值为0。当我们点击 + 按钮时,计数器的 counter 值将会自动加1,之后页面中当前值也会被更新。在这个例子中,点击事件引起了 counter 属性值的变化。

我们继续看下一个例子:

import { Component, OnInit } from '@angular/core'; @Component({
 selector: 'exe-counter',
 template: `
  <p>当前值:{{ counter }}</p>
 ` }) export class CounterComponent implements OnInit {
 counter = 0;
 ngOnInit() {
  setInterval(() => { this.counter++;
  }, 1000);
 }
}

该组件通过 setInterval 定时器,实现每秒钟 counter 值自动加1。在这种情况下,它是定时器事件引起了属性值的变化。最后我们再来看个例子:

import { Component, OnInit } from '@angular/core'; import { Http } from '@angular/http'; @Component({
 selector: 'exe-counter',
 template: `
  <p>当前值:{{ counter }}</p>
 ` }) export class CounterComponent implements OnInit {
 counter = 0; constructor(private http: Http) {}
 ngOnInit() { this.http.get('/counter-data.json')
    .map(res => res.json())
    .subscribe(data => { this.counter = data.value;
    });
 }
}

该组件在进行初始化的时候,会发送一个 HTTP 请求去获取初始值。当请求成功返回的时候,组件的 counter 属性的值会被更新。在这种情况下,它是由 XHR 回调引起了属性值的变化。

现在我们来总结一下,引起模型变化的三类事件源:

1、Events:click, mouseover, keyup ...

2、Timers:setInterval、setTimeout

3、XHRs:Ajax(GET、POST ...)

这些事件源有一个共同的特性,即它们都是异步操作。那我们可以这样认为,所有的异步操作都有可能会引起模型的变化。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 异常处理使用总结
Jun 21 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
Jun 14 Javascript
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
vue.js实现请求数据的方法示例
Feb 07 Javascript
微信小程序 上传头像的实例详解
Oct 27 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 Javascript
js实现简单的日历显示效果函数示例
Nov 25 Javascript
如何用Node.js编写内存效率高的应用程序
Apr 30 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 #Javascript
Node.js静态服务器的实现方法
Feb 28 #Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 #Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 #Javascript
webpack项目调试以及独立打包配置文件的方法
Feb 28 #Javascript
vue-cli+webpack项目 修改项目名称的方法
Feb 28 #Javascript
vue 组件 全局注册和局部注册的实现
Feb 28 #Javascript
You might like
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
python查看模块安装位置的方法
2018/10/16 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
python如何使用腾讯云发送短信
2020/09/17 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
PHP中如何创建和修改数组
2012/05/02 面试题
小学生自我鉴定
2013/10/12 职场文书
店长助理岗位职责
2013/12/13 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript