我有一个像这样定义的自定义指令:
app.directive('tagProfile', ['userService', function(userService) {
return {
restrict: 'E',
scope: {
mode: '@'
,entity: '='
,onUpdate: '&'
,onCancel: '&'
},
templateUrl: '/public/user/tag_profile.html',
controller: ['$scope', function($scope) {
$scope.userService = userService
}],
link: function(scope, element, attrs) {
}
}
}])
请注意,我在userService
中注入directive
,因为大多数关于自定义指令的教程都会在那里注入依赖项。我试图将它注入控制器功能,它也可以正常工作
controller: ['$scope', 'userService', function($scope, userService)
我最有可能只使用控制器功能,而不是链接功能。所以userService不会在链接中使用。除此之外,在两个地方注射都是一样的吗?或哪一个更好?
另外,为什么链接功能会注入scope
而不是$scope
?我们不使用显式注释来缩小支持?
答案 0 :(得分:1)
我最有可能只使用控制器功能,而不是链接功能。所以userService不会在链接中使用。除此之外,在两个地方注射都是一样的吗?或哪一个更好?
如果您不打算使用链接步骤,请坚持注入controller
。如果您想使用控制器和链接步骤,请在指令定义中进行注入。
据我所知,which of the two is better
或which of the two is recommended
没有区别。
在这种情况下,这指的是userService
。将$scope
注入指令定义中并不是我曾经做过的事情,所以我不能说可能带来什么样的副作用。
是否一样?
另外,为什么链接函数会注入范围而不是$ scope?我们不使用显式注释来缩小支持?
link
的第一个参数始终为$scope
,因此您的名字无关紧要。
/**
* $compileProvider.$get
* L#6931 in angular.js
*/
return compile;
function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) {
/**
* Redacted code...
*/
return function publicLinkFn(scope, cloneConnectFn, options) {
链接函数(由compile
返回)不需要显式注释,因为它不倾向于(或打开)DI。它的参数是预设的。
这与命名中的显式一样有效:
return {
link: function (a,b,c) {
// { a: $scope, b: $element, c: $attrs }
}
}
<强> TL;博士强>
directive
中的'stuff',请不要将'stuff'注入controller
。 link
不对DI开放。