Serenader

Learning by sharing

Angualr - directive's controller VS Link

post cover

简短的答案:放在 link 里面。

为毛?问问自己一个问题,我的代码应该在什么时候执行?
  1. 在模板编译之前执行?- controller
  2. 在模版编译之后执行?- link
controller 里面的代码会在编译之前执行,而 link 里面的代码会在编译之后执行。
var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'First ';
});

app.directive('exampleDirective', function() {
  return {
    restrict: 'E',
    template: '<p>Hello {{name}}!</p>',
    controller: function($scope, $element){
      $scope.name = $scope.name + "Second ";
    },
    link: function(scope, el, attr) {
      scope.name = scope.name + "Third ";
    }
  }
})
结果是:
Hello First Second Third !
controller 里面,可以通过依赖注入引入不同的函数模块等,而在 link 里面,函数的参数则是顺序固定的那几个参数,不同于 controller。这意味着,可以在 controller 里面对模版进行修改。例如,在 controller 里面注入 $compile 函数,编译指定模版,再进行其他操作。 而对于 link 而言,对DOM的操作的代码均应放在这里。
另外,directive 之间的沟通是通过 controller 来进行的。
var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $element) {
});

app.directive('exampleDirective', function() {
  return {
    restrict: 'E',
    template: '<child-directive></child-directive>',
    controller: function($scope, $element){
      this.awesomeVariable = "Awesome Content lives here!"
    }
  }
});

app.directive('childDirective', function() {
  return {
    restrict:  'E',
    template: '<h1>bar</h1>',
    replace: true,
    require: '^exampleDirective',
    link: function($scope, $element, attr, exampleDirectiveCtrl){
      // some awesome jquery pluggin which replaces things and bits
      $element.replaceWith(angular.element('<pre>' +  exampleDirectiveCtrl.awesomeVariable + '</pre>'));
    }
  }
});