Page 93 - AngularJS权威教程
P. 93

10.1  指令定义   73


                  当AngularJS启动应用时,它会把第一个参数当作一个字符串,并以此字符串为名来注册第                                       1
              二个参数返回的对象。AngularJS编译器会解析主HTML的DOM中的元素、属性、注释和CSS类名
              中使用了这个名字的地方,并在这些地方引用对应的指令。当它找到某个已知的指令时,就会在
              页面中插入指令所对应的DOM元素。                                                                      2

                  <div my-directive></div>
                                                                                                     3

                          为了避免与未来的HTML标准冲突,给自定义的指令加入前缀来代表自定义的
                         命名空间。AngularJS本身已经使用了ng-前缀,所以可以选择除此以外的名字。                                   4
                         在例子中我们使用my-前缀(比如my-derictive)。
                                                                                                     5
                  指令的工厂函数只会在编译器第一次匹配到这个指令时调用一次。和controller函数类似,
              我们通过$injetor.invoke来调用指令的工厂函数。
                                                                                                     6
                  当AngularJS在DOM中遇到具名的指令时,会去匹配已经注册过的指令,并通过名字在注册
              过的对象中查找。此时,就开始了一个指令的生命周期,指令的生命周期开始于$compile方法并
              结束于link方法,在本章后面的内容中我们会详细介绍这个过程。                                                        7
                  下面,来看看定义一个指令时可以使用的全部设置选项。
                                                                                                     8


                          一个JavaScript对象由键和值组成。当一个给定键的值被设置为一个字符串、布
                         尔值、数字、数组或对象时,我们把这个键称为属性。当把键设置为函数时,                                          9
                         我们把它叫做方法。
                                                                                                     10
                  可能的选项如下所示,每个键的值说明了可以将这个属性设置为何种类型或者什么样的
              函数:
                                                                                                     11
                  angular.module('myApp', [])
                  .directive('myDirective', function() {
                      return {
                          restrict: String,                                                          12
                          priority: Number,
                          terminal: Boolean,
                          template: String or Template Function:                                     13
                              function(tElement, tAttrs) (...},
                          templateUrl: String,
                          replace: Boolean or String,                                                14
                          scope: Boolean or Object,
                          transclude: Boolean,
                          controller: String or
                          function(scope, element, attrs, transclude, otherInjectables) { ... },     15
                          controllerAs: String,
                          require: String,
                          link: function(scope, iElement, iAttrs) { ... },                           16
                          compile: // 返回一个对象或连接函数,如下所示:
                              function(tElement, tAttrs, transclude) {
                                  return {
                                      pre: function(scope, iElement, iAttrs, controller) { ... },    17
                                      post: function(scope, iElement, iAttrs, controller) { ... }
                                  }
                                  // 或者                                                              18
                                  return function postLink(...) { ... }
   88   89   90   91   92   93   94   95   96   97   98