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