浅谈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 内存释放问题
Apr 25 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
Jul 05 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
Nov 29 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 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过滤危险html代码
2008/08/18 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
JS定时器实例
2013/04/17 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
python 对象和json互相转换方法
2018/03/22 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Python读写压缩文件的方法
2020/07/30 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
医院总经理职责
2013/12/26 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
一条 SQL 语句执行过程
2022/03/17 MySQL