浅谈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 相关文章推荐
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
论JavaScript模块化编程
Mar 07 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
May 04 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
Aug 19 Javascript
微信小程序异步处理详解
Nov 10 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
Jun 18 jQuery
gojs实现蚂蚁线动画效果
Feb 18 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常见的魔术方法详解
2014/12/25 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
javascript 禁止复制网页
2009/06/11 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
python学生信息管理系统(完整版)
2020/04/05 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Python如何调用外部系统命令
2019/08/07 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
毕业设计计划书
2014/01/09 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
Nginx实现会话保持的两种方式
2022/03/18 Servers