欢迎大家指导与讨论 : )

  前言

  Angular会拓展这个标准的浏览器流程,创建一个Angular上下文。这个Angular上下文指的是运行在Angular事件循环内的特定代码,该Angular事件循环被称作为$digest循环。$digest循环有两个组成部分,分别是$watch列表和$evalAsync列表。

  例如,当 <input> 标签绑定了$scope.name属性,为了更新这个视图,Angular需要追踪变化。它是通过给$watch列表添加一个监控函数做到这一点。而$watch列表会在$digest循环中通过一个叫做"脏值检查"的程序解析。

  脏值检查

   Angular会持续追踪当前监控的值。Angular会遍历$watch列表,如果从旧值更新后的值没有发生变化,它会继续遍历监控列表。如果值发生了变化,则Angular会启用新值并继续遍历$watch列表。Angular会遍历完整个列表,只要有任何值发生变化,它就会退回到$watch循环中,直到检测到不再发生变化。如果这个循环运行了10次或者更多,则Angular会抛出一个异常,并停止运行。

  例子

  某间学校里,同学们都要在这儿住宿,但是呢有好几个学生很不乖,整天不好好睡觉,就知道玩游戏。学校领导知道后就要求老师说:"hey! 哥们, 这几间宿舍的学生特别不乖,你帮我多多看着他们!",同时把一份宿舍名单列表给了老师($watch列表里添加了监控函数)。每天晚上,老师都会不断巡查宿舍名单列表上的那几间宿舍(Angular遍历监控列表)。突然有一天,老师在巡查432宿舍的时候发现小明居然不好好睡觉而是在玩游戏!(Angular发现了变化),老师把小明教育了一顿,然后让它继续睡觉(启用变化后的新值)。但是老师就想,刚才小明是不是在和别的宿舍的同学一起联机玩游戏呢?我得继续巡查巡查(受变化值的影响,$watch列表中的其他值,可能跟随着一起发生了变化,也可能没有。例如$scope.num1=1,现在发生了变化,$scope.num1=10了。然后呢$scope.num2=2,不会受到$scope.num1影响,但是呢$scope.num3=num1+10的,它的值由原来的11变成了20, 因此Angular会进行二次巡查,直到监听的值没有再发生变化)。

  $watch

  $watch函数会给监听函数返回一个注销函数,我们可以通过调用注销函数来取消Angular对当前值的监听

var unregisterWatch = $scope.watch('model.email',
function(newVal, oldVal){
if(newVal === oldVal) return; //初始化
if(newVal != oldVal){
//...
}
}
)

  假如对完成了该值的监听,可以通过调用 unregisterWatch() 来取消监控。其中,监听函数会在初始化时被调用一次,此时newVal === oldVal均为undefined

  $watchCollection

  可以通过此函数为对象的属性或者数组元素设置浅监控

$scope.watchCollection('names',
function(newNames, oldNames){
//
}
)

  $apply()与$digest()

  $apply()函数可以从Angular框架的外部让表达式在Angular上下文内部执行,并让结果受控(进行digest循环)。例如实现了一个setTimeout()并想让事件运行在Angular上下文内部时,就必须使用$apply()

$scope.apply(function(){
setTimeout(function(){
//...
}, 1000)
})

  或者直接通过调用$digest()函数进行digest循环,以进行脏值检查

//..some action
$scope.$digest();

  

  参考资料

  《AngularJS权威指南》P326

AngularJS中的digest循环$apply的更多相关文章

  1. 深入了解angularjs中的$digest与$apply方法,从区别聊到使用优化

     壹 ❀ 引 如果有人问,在angularjs中修改模型数据为何视图会同步更新呢,我想大多数人一定会回答脏检查(Dirty Checking)相关概念.没错,在angularjs中作用域(scope) ...

  2. angularjs 中的$digest和$apply区别

    $digest和$apply 在Angular中,有$apply和$digest两个函数,我们刚才是通过$digest来让这个数据应用到界面上.但这个时候,也可以不用$digest,而是使用$appl ...

  3. angularJS中的$apply(),$digest(),$watch()

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...

  4. angularJS中$apply()方法详解

    这篇文章主要介绍了angularJS中$apply()方法详解,需要的朋友可以参考下   对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的 ...

  5. angularJS之$watch、$digest和$apply方法

    最近项目上使用了比较多的angular JS,一直都对它感觉比较陌生,总觉得有点反直觉,这段时间,准备下定决心弄明白,这个框架到底是怎么一回事,以及它的工作原理,生命周期……一点一点的啃完它吧.首先, ...

  6. 深入学习AngularJS中数据的双向绑定机制

    来自:http://www.jb51.net/article/80454.htm Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持 ...

  7. angular的$watch,$digest和$apply

    第一部分:$watch $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqu ...

  8. 关于AngularJs中监听事件及脏循环的理解

    可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...

  9. AngularJS中的指令全面解析(转载)

    说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...

随机推荐

  1. 【代码笔记】iOS-多张图片合成一张

    代码: RootViewController.m #import "RootViewController.h" @interface RootViewController () @ ...

  2. js自执行函数的几种不同写法的比较

    经常需要一个函数自执行,可惜这一种写法是错的: function(){alert(1);}();  原因是前半段“function(){alert(1);}”被当成了函数声明,而不是一个函数表达式,从 ...

  3. db2简单语句记录

    db2start db2 connect reset 断开连接 db2 drop db xxx 删除数据库 db2 list tables 查看表 db2 create database xxx 建立 ...

  4. [oracle]数据库语言分类

    一般来说,数据库语言可以分成以下5大类: 1.数据定义语言DDL(Data Definition Language),用于改变数据库结构,包括创建.修改和删除数据库对象.包括create(创建).al ...

  5. IP地址(IPv4)/IPv6地址的正则表达式

    原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...

  6. Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出

    1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...

  7. ThreadPoolExecutor-线程池开发的使用

    好久没有写过笔记了,最近做的一个项目涉及打线程池和队列的开发,觉得在这个项目中学习到的还是挺多的,对线程安全,并发的知识有加深认知:当然,现在用过的东西并不是代表以后还能娴熟的使用,做好笔记非常重要: ...

  8. android 查看解压后的.xml文件代码(axmlprinter2)

    axmlprinter2工具下载地址:http://pan.baidu.com/s/1o67eXtS 方法:1.将要查看的.xml文件复制到AXMLPrinter2.jar所在目录2.通过cmd 输入 ...

  9. linux 目录结构及其相关命令

    目录也是一个文件,它的唯一功能是用来保存文件及其相关信息.所有的文件,包括普通文件.设备文件和目录文件,都会被保存到目录中. 主目录 登录后,你所在的位置就是你的主目录(或登录目录),如果是root用 ...

  10. RedHat 6.2 Linux修改yum源免费使用CentOS源

    在没有光盘的情况,需要安装软件包,就要用到共网的yum源来安装了. RedHat linux 默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件,如果我们需要 ...