浅谈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 相关文章推荐
用document.documentElement取代document.body的原因分析
Nov 12 Javascript
jQuery MD5加密实现代码
Mar 15 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
Oct 05 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
详解如何在Angular优雅编写HTTP请求
Dec 05 Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
Vue项目开发常见问题和解决方案总结
Sep 11 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新手上路(十)
2006/10/09 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
Javascript - HTML的request类
2007/01/09 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Python 装饰器深入理解
2017/03/16 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
网络工程师职业规划
2014/02/10 职场文书
教师继续教育反思周记
2015/06/25 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
python百行代码实现汉服圈图片爬取
2021/11/23 Python