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流程中。
   351   352   353   354   355   356   357   358   359   360   361