Page 107 - AngularJS权威教程
P. 107

10.4  AngularJS 的生命周期   87


                  require参数的值可以用下面的前缀进行修饰,这会改变查找控制器时的行为:                                             1

                  ?
                  如果在当前指令中没有找到所需要的控制器,会将null作为传给link函数的第四个参数。                                        2
                  ^
                                                                                                     3
                  如果添加了^前缀,指令会在上游的指令链中查找require参数所指定的控制器。

                  ?^
                                                                                                     4
                  将前面两个选项的行为组合起来,我们可选择地加载需要的指令并在父指令链中进行查找。
                  没有前缀                                                                               5

                  如果没有前缀,指令将会在自身所提供的控制器中进行查找,如果没有找到任何控制器(或
              具有指定名字的指令)就抛出一个错误。                                                                     6


              10.4  AngularJS 的生命周期                                                                  7

                  在AngularJS应用起动前,它们以HTML文本的形式保存在文本编辑器中。应用启动后会进行
              编译和链接,作用域会同HTML进行绑定,应用可以对用户在HTML中进行的操作进行实时响应。                                          8
              这个神器的效果是如何发生的?创建高效率的应用需要了解什么?
                                                                                                     9
                  在这个过程中总共有两个主要阶段。

              10.4.1  编译阶段                                                                           10


                  第一个阶段是编译阶段。在编译阶段,AngularJS会遍历整个HTML文档并根据JavaScript中
              的指令定义来处理页面上声明的指令。                                                                      11

                  每一个指令的模板中都可能含有另外一个指令,另外一个指令也可能会有自己的模板。当
              AngularJS调用HTML文档根部的指令时,会遍历其中所有的模板,模板中也可能包含带有模板的                                       12
              指令。
                                                                                                     13
                          模板树可能又大又深,但有一点需要注意,尽管元素可以被多个指令所支持或
                         修饰,这些指令本身的模板中也可以包含其他指令,但只有属于最高优先级指
                         令的模板会被解析并添加到模板树中。这里有一个建议,就是将包含模板的指                                          14
                         令和添加行为的指令分离开来。如果一个元素已经有一个含有模板的指令了,
                         永远不要对其用另一个指令进行修饰。只有具有最高优先级的指令中的模板会                                          15
                         被编译。
                                                                                                     16
                  一旦对指令和其中的子模板进行遍历或编译,编译后的模板会返回一个叫做模板函数的函
              数。我们有机会在指令的模板函数被返回前,对编译后的DOM树进行修改。
                                                                                                     17
                  在这个时间点DOM树还没有进行数据绑定,意味着如果此时对DOM树进行操作只会有很少
              的性能开销。基于此点,ng-repeat和ng-transclude等内置指令会在这个时候,也就是还未与
              任何作用域数据进行绑定时对DOM进行操作。                                                                  18
   102   103   104   105   106   107   108   109   110   111   112