Page 355 - AngularJS权威教程
P. 355

24.1  视图的工作原理    335


                  Angular会使用ng-app指令的值配置$injector服务(第13章深入讨论了这个服务)。                                  19
                  一旦应用程序加载完成,$injector就会在应用程序的$rootScope旁边创建$compile服务。

                  $rootScope创建后, $compile服务就会接管它。它会将$rootScope与现有的DOM连接起来,                           20
              然后从将ng-app指令设置为祖先的地方开始编译DOM。
                                                                                                     21
              24.1  视图的工作原理


                  当浏览器在标准的Web流程中获取HTML时,它会收到HTML代码并将它解析为一个DOM                                        22
              树。这个DOM树中的每个元素被称作DOM元素,这些DOM元素会构建一堆节点。然后浏览器负
              责绘制出这个DOM树的结构。                                                                         23

                  浏览器在提取脚本时(从<script>标签中),会暂停DOM解析并等待脚本取回(你可以修改
              这一行为,但是这个行为是默认的)。                                                                      24
                  当angular.js被取回时,浏览器会执行它,同时设置一个事件监听器来监听浏览器的
              DOMContentLoaded事件。                                                                    25


                          DOMContentLoaded事件会在HTML文档加载完成并开始解析时触发。                                    26


                  检测到这个事件时,Angular会查找ng-app指令,然后创建运行需要的一系列必要的组件(即
              $injector、$compile服务以及$rootScope),然后开始解析DOM树。                                          27

              24.1.1  编译阶段                                                                           28

                  $compile服务会遍历DOM树并搜集它找到的所有指令,然后将所有这些指令的链接函数合
              并为一个单一的链接函数。                                                                           29
                  然后这个链接函数会将编译好的模板链接到$rootScope中(也就是附属于ng-app所在的
              DOM元素的作用域)。                                                                            30

                  它会通过检查DOM属性、注释、类以及DOM元素名称的方式查找指令。
                                                                                                     31
                  <span my-directive></span>
                  <span class="my-directive"></span>
                  <my-directive></my-directive>                                                      32
                  <!-- directive: my-directive -->


                          更多有关指令的信息请参考第10章。                                                          33


                  $compile服务通过遍历DOM树的方式查找有声明指令的DOM元素。当碰到带有一个或多个                                      34
              指令的DOM元素时,它会排序这些指令(基于指令的priority优先级),然后使用$injector服
              务查找和收集指令的compile函数并执行它。
                                                                                                     35
                  指令中的compile函数会在适当的时候处理所有DOM转换或者内联模板,如同创建模板的
              副本。
                                                                                                     36
   350   351   352   353   354   355   356   357   358   359   360