浅谈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 相关文章推荐
IE6/7/8中Option元素未设value时Select将获取空字符串
Apr 07 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
JS实现3D图片旋转展示效果代码
Sep 22 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
Mar 01 Javascript
详解Vue.use自定义自己的全局组件
Jun 14 Javascript
vue2.x+webpack快速搭建前端项目框架详解
Nov 30 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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
PHP Directory 函数的详解
2013/03/07 PHP
php实现异步数据调用的方法
2015/12/24 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
用python实现的线程池实例代码
2018/01/06 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
Python 移动光标位置的方法
2019/01/20 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
抽象类和接口的区别
2012/09/19 面试题
模具数控专业自荐信
2014/01/27 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
奖学金感谢信
2015/01/21 职场文书
入党积极分子考察意见
2015/06/02 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
opencv 分类白天与夜景视频的方法
2021/06/05 Python
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python