在哪里指定自定义指令依赖项。在控制器和指令级别是一样的吗?

时间:2015-07-11 16:42:09

标签: angularjs angularjs-directive

我有一个像这样定义的自定义指令:

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?我们不使用显式注释来缩小支持?

1 个答案:

答案 0 :(得分:1)

  

我最有可能只使用控制器功能,而不是链接功能。所以userService不会在链接中使用。除此之外,在两个地方注射都是一样的吗?或哪一个更好?

如果您不打算使用链接步骤,请坚持注入controller。如果您想使用控制器和链接步骤,请在指令定义中进行注入。

据我所知,which of the two is betterwhich 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开放。