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 列表

                 每当我们在视图中追踪一个事件时,会给它注册一个回调函数,然后希望在页面中触发该事
   341   342   343   344   345   346   347   348   349   350   351