指令中2个“postLink”函数之间有什么区别?

时间:2013-01-28 15:18:36

标签: angularjs angularjs-directive

从angularjs的文档中,在定义指令时,postLink中有compilepostLink中有link

myModule.directive('directiveName', function factory(injectables) {
  var directiveDefinitionObject = {
    priority: 0,
    template: '<div></div>',
    templateUrl: 'directive.html',
    replace: false,
    transclude: false,
    restrict: 'A',
    scope: false,
    compile: function compile(tElement, tAttrs, transclude) {
      return {
        pre: function preLink(scope, iElement, iAttrs, controller) { ... },
        post: function postLink(scope, iElement, iAttrs, controller) { ... }
      }
    },
    link: function postLink(scope, iElement, iAttrs) { ... }
  };
  return directiveDefinitionObject;
});

他们之间有什么区别?我注意到postLink中的link的参数小于compile中的参数。还有其他区别吗?

2 个答案:

答案 0 :(得分:30)

它们没有什么不同,你所拥有的只是文档中的伪代码。 postLink函数是最重要的函数,因此有多种方法可以声明它。

以下是Plunker作为示例......

...这里有一些伪代码,显示了postLink函数的不同声明:

app.directive('dir1', function () {
   return function(scope, elem, attr) {
       //this is the same
   };
});

app.directive('dir2', function () {
   return {
       link: function(scope, elem, attr) {
           //this is the same
       }
   };
});

app.directive('dir3', function () {
   return {
      compile: function compile(tElement, tAttrs, transclude) {
         return {
           post: function postLink(scope, elem, attrs) {
              //this is the same
           }
         }
      }
   };
});

......你只需要一个。

答案 1 :(得分:0)

本质区别在于,在预链接功能中,子元素尚未链接。但是在后链接功能中,它有。

这对DOM操作有影响。由于链接过程可能会进一步操纵DOM,因此只有当子节点已经链接时,才能安全地操作DOM - 这只适用于后链接函数。