目录

一: 概念简介

脏值检测,简单的说就是在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):脏值检测机制的更多相关文章

  1. Angularjs 脏值检测

    文章转自:http://www.ituring.com.cn/article/39865 构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.inf ...

  2. ionic3 双向数据绑定失效 脏值检测失效

    最近在使用ionic3过程中,使用了eval()方法进行字符串拼接成一个function使用 在eval()方法中,只能使用局部变量,全局变量无法使用,ionic3的this在eval中失效(unde ...

  3. 迈向angularjs2系列(6):路由机制

    目录1.angular-seed的路由2.路由机制的探索3.懒加载 一:angular-seed的路由 step1:安装种子项目    $ git clone --depth 1 https://gi ...

  4. 迈向angularjs2系列(1):typescript指南

    typescript指南 前言 typescript是angularjs2推荐使用的脚本语言.它由微软2012年首次发布. 一.    typescript和javascript的区别 1.从遵循的规 ...

  5. 迈向angularjs2系列(5):依赖注入

    一: 为什么要依赖注入 1.构造器引入依赖 假设一个类Car类依赖于Engine(引擎)类.Transition(变速箱)类,可使用构造器来完成. //类似如下代码 class Engine{} cl ...

  6. 迈向angularjs2系列(2):angular2指令详解

    一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...

  7. 迈向angularjs2系列(7):表单

    目录 一:校验表单的使用 1.搭建脚手架 2.校验表单的使用 3.select下拉列表的用法 一: 校验表单的使用 对于CRUD型的应用,表单是必备组件. 1.搭建脚手架 git clone http ...

  8. 迈向angularjs2系列(3):组件详解

    一: 以组件开发一个to-do list应用 todo组件分为导入.接口定义.顶层组件.控制器.启动5个部分. app.ts: //导入 import {Component} from '@angul ...

  9. 迈向angularjs2系列(8):angular cli和angular2种子项目

    文章目录 1.angular cli快速搭建项目 2.angular2-seed 3.手动配置 题外话:如何更好的阅读本篇文章 一: angular cli的安装 Angular-cli(命令行界面, ...

随机推荐

  1. android - gradle编译错误 exit value 1,2,3总结

    在使用jenkins,使用gradle编译的时候总会出现一些问题,下面是几个常见问题的解决方法. 被编译的代码或资源有问题( finished with non-zero exit value 1): ...

  2. Objective-c 多线程操作 自定义NSOperation 模拟下载

    写在前面 使用多线程下载图片,使用内存缓存和磁盘缓存. 这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库 效果 下载多张图片时可控制线程并发数 分析 自定义NSO ...

  3. javaBean与Servlet学习

    1.JavaBean JavaBean将java代码单独封装成了一个处理某种业务逻辑的类,可以降低HTML与Java代码的耦合度,并且简化JSP页面,提高Java程序代码的重用性及灵活性. JavaB ...

  4. phpMyAdmin安装部署

    phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库.通过phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等.如果使用合适的工具, ...

  5. 小程序server-3-搭建WebSocket 服务

    小程序server-3-搭建WebSocket 服务: 1.安装 Node 模块 使用 ws 模块来在服务器上支持 WebSocket 协议,下面使用 NPM 来安装: cd /var/www/wxp ...

  6. Go语言学习笔记(六)net

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP.UD ...

  7. year:2017 month:7 day:19

    2017-07-19 JavaScript 一:javascirpt的对象 1:数组对象 声明方式:(1)var arr=new Array(): (2)var arr=new Array(12): ...

  8. year:2017 month:7 day:17

    2017-07-17 JavaScript 1.javascript 中的运算符 (1)算数运算符:+ ,- ,* ,/ ,% (2)位运算符:& ,| ,~  ,^ ,<< (左 ...

  9. SSE再学习:灵活运用SIMD指令6倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由180ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...

  10. 感知器算法--python实现

    写在前面: 参考: 1  <统计学习方法>第二章感知机[感知机的概念.误分类的判断]   http://pan.baidu.com/s/1hrTscza 2   点到面的距离 3   梯度 ...