简短的答案:放在 link
里面。
为毛?问问自己一个问题,我的代码应该在什么时候执行?
- 在模板编译之前执行?-
controller
- 在模版编译之后执行?-
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>'));
}
}
});