Page 356 - AngularJS权威教程
P. 356
336 第 24 章 揭秘 Angular
// 返回一个链接函数
var linkFunction = $compile(appElement);
// 调用链接函数,将$rootScope附加给DOM元素
linkFunction($rootScope);
每个节点的编译方法运行之后, $compile服务就会调用链接函数。这个链接函数为绑定了封
闭作用域的指令设置监控。这一行为会创建实时视图。
最后,在$compile服务完成后,AngularJS运行时就准备好了。
24.1.2 运行时
在标准的浏览器流程中,事件循环会等待事件执行(比如鼠标移动、点击、按键等)。当这
些事件发生时,它们会被放到浏览器的事件队列中。如果有函数处理程序对事件作出响应,浏览
器就会将event对象作为参数来调用这些事件处理程序。
ele.addEventListener('click', function(event) {});
Angular中对事件循环做了一点增强,并且Angular还提供了自己的事件循环。指令自身会注
册事件监听器,因此当事件被触发时,指令函数就会运行在AngularJS的$digest循环中。
Angular的事件循环被称作$digest循环。这个$digest循环由两个小型的循环组
成,分别是evalAsync循环和$watch列表。
当事件被触发时,事件处理程序就会在指令的上下文中进行调用,也就是AngularJS的上下
文中。从功能上讲,AngularJS会在包含作用域的$apply()方法内调用指令。Angular是在
$rootScope上启动$digest循环时开始整个过程的,并且还会传播到所有子作用域中。
Angular进入$digest循环时,会等待$evalAsync队列清空,然后再将回调执行上下文交还
给浏览器。这个$evalAsync用于在浏览器进行渲染之前,调度需要运行在当前桢栈(stack frame)
之外的所有任务。
此外,$digest循环还会等待$watch表达式列表,它是一个可能在上一次迭代过程中被改变
的潜在的表达式数组。如果检测到变化,就调用$watch函数,然后再次查看$watch列表以确保
没有东西被改变。
注意,对于$watch列表中检测到的任何变化,AngularJS都会再次查看这个列表
以确保没有东西被改变。
一旦$digest循环稳定下来,并且检测到没有潜在的变化了,执行过程就会离开Angular上下
文并且通常会回到浏览器中,DOM将会被渲染到这里。
整个流程在每个浏览器事件之间都会发生,这也是Angular如此强大的原因。它还可以将来
自浏览器的事件注入到AngularJS流程中。