迈向angularjs2系列(4):脏值检测机制
目录
一: 概念简介
脏值检测,简单的说就是在MVC的构架中,视图会通过模型的change事件来更新自己。
脏值检测的核心代码是观察者模式的实现,其机制会执行digest循环,在特定UI组件的上下文执行注册的各种表达式。
那么脏值检测在单页应用扮演了什么角色呢?

为了支持单页SPA应用,angular1引入了指令的概念,能够扩展HTML标签并且封装相关的DOM逻辑,以此来构建组件,组件再组合成一个个网页。angular2也保留了指令的概念。那么angular2和1版本的区别在哪里呢?angular2的指令则是简化版的指令API,能通过属性型的指令给DOM标签添加行为。
而与此同时,组件则可以看做指令API的补充,既可以添加模板,也可以添加行为,组件继承自指令。
@Directive({
selector: '[saTooltip]'
})
export class Tooltip {
//略
}
二: angular1中的脏值检测
ch4-change-detection/angular1-demo/index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="angular.js"></script>
<!--引入版本为1.5.0-->
<script>
angular.module("app",[])
.controller("mainCtrl",function($scope){
$scope.label="hello world!";
});
</script>
</head>
<body ng-app="app" ng-controller="mainCtrl"> <div>
<span>label值:{{label}}</span>
<br/>
<input type="text" ng-model="label"/>
</div>
</body>
</html>
浏览器结果

angular1的数据绑定,酷炫而神秘!可是它幕后实际发生了什么呢?
(1)首先,在指令ng-model和双大括号(实际上是ng-bind指令)内部绑定了多个watcher(监视器)。
(2)接下来,当指定的事件发生之后,angular循环遍历所有的监视器,并执行对应scope上下文的表达式。这里就是digest循环。
(3)最后,比对两次结果,如果不相同就调用回调函数。
但这种发生特定事件(有可能在框架管理范围内,也可能在范围外部)会调用digest循环有缺点。比如回调函数有setTimeOut定时器,定时器把绑定到Scope上的属性给修改了,那么angular就无法察觉对象的改变了。angular2解决这个问题。
二: angular2更优的脏值检测
1.zone.js库
zone.js是angular2的一个库,可以在javascript实现各种分区。分区代表一个执行上下文。angular2利用了zone.js来拦截浏览器中的各种异步事件,然后在正确的时机调用digest循环,完全消除了需要angular开发者显式调用digest循环的情况。
2.单向数据流
在第一章的例子里,label表达式在ng-model指令下发生改变,也会通知label的双大括号表达式改变值,这隐含了指令之间互相影响、有依赖关系。跨监视器的依赖会创建出各种纠缠不清的额数据流,导致最后可能很难追踪,进而导致难以预料的错误。
angular2保留了脏值检测的概念用来检测数据,但强制使用了单向数据流。
实现的方式:
禁止不同的监视器互相依赖,digest循环只要运行一次就好了。
单向数据流好处不仅仅于此,更简单的数据流,而且性能提高了
3.增强angular1的脏值检测
我们说到digest循环有比较的步骤,比较操作的最佳算法是根据表达式返回值的类型进行比较。angular1有的是浅比较,有的是深比较,而且开发者并不能自己预先决定使用哪种比较。angular2团队把比较功能分离到了differ(差异比较器)中,那么开发者就可以通过2个基础类扩展自定义算法了,从而有了对脏值检测机制的完全控制。
●KeyValueDiffer。键值对型差异比较器。
●IterableDiffer。迭代型差异比较器。
迈向angularjs2系列(4):脏值检测机制的更多相关文章
- Angularjs 脏值检测
文章转自:http://www.ituring.com.cn/article/39865 构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.inf ...
- ionic3 双向数据绑定失效 脏值检测失效
最近在使用ionic3过程中,使用了eval()方法进行字符串拼接成一个function使用 在eval()方法中,只能使用局部变量,全局变量无法使用,ionic3的this在eval中失效(unde ...
- 迈向angularjs2系列(6):路由机制
目录1.angular-seed的路由2.路由机制的探索3.懒加载 一:angular-seed的路由 step1:安装种子项目 $ git clone --depth 1 https://gi ...
- 迈向angularjs2系列(1):typescript指南
typescript指南 前言 typescript是angularjs2推荐使用的脚本语言.它由微软2012年首次发布. 一. typescript和javascript的区别 1.从遵循的规 ...
- 迈向angularjs2系列(5):依赖注入
一: 为什么要依赖注入 1.构造器引入依赖 假设一个类Car类依赖于Engine(引擎)类.Transition(变速箱)类,可使用构造器来完成. //类似如下代码 class Engine{} cl ...
- 迈向angularjs2系列(2):angular2指令详解
一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...
- 迈向angularjs2系列(7):表单
目录 一:校验表单的使用 1.搭建脚手架 2.校验表单的使用 3.select下拉列表的用法 一: 校验表单的使用 对于CRUD型的应用,表单是必备组件. 1.搭建脚手架 git clone http ...
- 迈向angularjs2系列(3):组件详解
一: 以组件开发一个to-do list应用 todo组件分为导入.接口定义.顶层组件.控制器.启动5个部分. app.ts: //导入 import {Component} from '@angul ...
- 迈向angularjs2系列(8):angular cli和angular2种子项目
文章目录 1.angular cli快速搭建项目 2.angular2-seed 3.手动配置 题外话:如何更好的阅读本篇文章 一: angular cli的安装 Angular-cli(命令行界面, ...
随机推荐
- nyoj_5:Binary String Matching
简单字符串匹配 题目链接 #include<iostream> #include<cstring> using namespace std; int fun(char*aa,c ...
- 深入理解 JavaScript(二)
立即调用的函数表达式 前言 大家学 JavaScript 的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下"自执行"这 ...
- Memcached的基础梳理
1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...
- Unity 工作经历+近期面试经历
由于团队解散,这最近都在找新工作机会--投简历找工作.已经面试三家了,都没拿到offer,挺失落的.把这种感受记录下来,以作后鉴. 这本质上是一篇面试经历的记录,并不是什么面试攻略,主要是给自己总结的 ...
- Spring mybatis源码篇章-SqlSessionFactoryBean
前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目SchoolActivity_WxServer,引用的jar包为mybatis-spring-1.3.0.jar Sp ...
- ARKit 初体验
ARKIT是苹果公司在今年发布的一个AR开发包,用于现有的IOS设备,是的,就是用在手机或者平板上,类似于pokemon go的效果.看了下演示视屏,嗯,看起来很厉害. 对于一个资深软粉,居然被要求研 ...
- 【php】php 连接数据库
$mysql_server_name=""; //数据库服务器名称 $mysql_username=""; // 连接数据库用户名 $mysql_passwor ...
- JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...
- C#设计模式(1)-单例模式
单例(Singleton)模式介绍 单例模式:也可以叫单件模式,官方定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一 ...
- 聪明的燕姿[JLOI2014]
题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ...