Page 110 - AngularJS权威教程
P. 110
90 第 10 章 指令详解
进行链接后被调用,因此它负责设置事件监听器,监视数据变化和实时的操作DOM。
link函数对绑定了实时数据的DOM具有控制能力,因此需要考虑性能问题。回顾一下10.4
节中关于性能的考虑,在选择是用编译函数还是链接函数实现功能时,将性能影响考虑进去。
链接函数的签名如下:
link: function(scope, element, attrs) {
// 在这里操作DOM
}
如果指令定义中有require选项,函数签名中会有第四个参数,代表控制器或者所依赖的指
令的控制器。
// require 'SomeController',
link: function(scope, element, attrs, SomeController) {
// 在这里操作DOM,可以访问required指定的控制器
}
如果require选项提供了一个指令数组,第四个参数会是一个由每个指令所对应的控制器组
成的数组。
下面看一下链接函数中的参数:
scope
指令用来在其内部注册监听器的作用域。
iElement
iElement参数代表实例元素,指使用此指令的元素。在postLink函数中我们应该只操作此
元素的子元素,因为子元素已经被链接过了。
iAttrs
iAttrs参数代表实例属性,是一个由定义在元素上的属性组成的标准化列表,可以在所有指
令的链接函数间共享。会以JavaScript对象的形式进行传递。
controller
controller参数指向require选项定义的控制器。如果没有设置require选项,那么
controller参数的值为undefined。
控制器在所有的指令间共享,因此指令可以将控制器当作通信通道(公共API)。如果设置了
多个require,那么这个参数会是一个由控制器实例组成的数组,而不只是一个单独的控制器。
10.5 ngModel
ngModel是一个用法特殊的指令,它提供更底层的API来处理控制器内的数据。当我们在指令
中使用ngModel时能够访问一个特殊的API,这个API用来处理数据绑定、验证、CSS更新等不实
际操作DOM的事情。
ngModel控制器会随ngModel被一直注入到指令中,其中包含了一些方法。为了访问
ngModelController必须使用require设置(像前面的例子中那样):