Page 346 - AngularJS权威教程
P. 346
326 第 23 章 digest 循环和$apply
第23章
digest循环和$apply
让我们来看看Angular在后台是如何工作的。如何只使用几行代码就得到神奇的数据绑定?
最重要的是理解$digest循环是如何工作的,以及如何使用$apply()方法。
在标准的浏览器流程中,当事件被触发时(比如点击一个链接),浏览器会执行注册给该事
件的回调函数。
页面加载、$http请求返回响应、鼠标移动以及按钮被点击等情况都会触发事件。
当事件被触发时,JavaScript就会创建一个事件对象,并执行这个事件对象所在的监听特定事
件的所有函数。然后它会运行JavaScript函数内的回调方法,这会回到浏览器中,还可能更新DOM。
同一时间不能运行两个事件。浏览器会等待前一个事件处理程序执行完成,再
调用下一个事件处理程序。
在非Angular JavaScript环境中,可以给div的点击事件附加一个回调函数。无论何时,只要
发现元素上的点击事件,这个回调函数就会运行:
var div = document.getElementById("clickDiv");
div.addEventListener("click", function(evt) {
console.log("evt", evt);
});
你可以打开Chrome开发者工具,然后将上面的代码复制粘贴到任意页面中,再
点击页面试试。
无论何时,只要浏览器检测到点击事件,就会调用使用addEventListener注册到文档上的函数。
当我们将Angular混入这个流程中时,它会扩展这个标准的浏览器流程,创建一个Angular上
下文。这个Angular上下文指的是运行在Angular事件循环内的特定代码,该Angular事件循环通常
被称作$digest循环。为了理解这个Angular上下文,需要看看在它里面到底发生了什么。而
$digest循环有两个主要组成部分:
$watch列表;
$evalAsync列表。
23.1 $watch 列表
每当我们在视图中追踪一个事件时,会给它注册一个回调函数,然后希望在页面中触发该事