Angularjs 在跨多个指令共享的链接函数中添加角度相关性

Angularjs 在跨多个指令共享的链接函数中添加角度相关性,angularjs,Angularjs,我有几个指令使用相同的链接函数。(link函数根据用例添加了一些额外的状态和html。)因此我声明如下: function common_linkfunc(){...} var Directive_1 = function($scope, etc) { return {restrict:"E", ... link: common_linkfunc, controller: function($scope, etc) {...} }; }

我有几个指令使用相同的链接函数。(link函数根据用例添加了一些额外的状态和html。)因此我声明如下:

function common_linkfunc(){...}

var Directive_1 = function($scope, etc) {
   return {restrict:"E", ...
           link: common_linkfunc,
           controller: function($scope, etc) {...}
   };
}
Directive_1.$injects = ["$scope", "etc"];
angular.module("module").directive("D1", Directive_1)...;
第一个变化是当需要链接函数时
$compile
。接下来我需要添加
$templateCache
,我的问题是如何系统地完成这项工作

我的第一个方法是将
common_linkfunc
重写为

function foo($compile, $templateCache) {
    return common_linkfunc($compile, $templateCache) {...}
}
然后在每一条指令中使用:

。。。 链接:foo($compile,$templateCache),


但这是复制和粘贴!有没有一种更简单、更不容易出错的方法可以做到这一点?

无论采用何种解决方案,您都需要向公共链接函数传递一些参数,因为Angular不会为您注入任何内容。尽管如此,我可以想到两种不同的方法:

1)使用
参数

app.directive('foo', function($http, $timeout) {
  return {
    restrict: 'E', 
    link: linkFn1.apply(null, arguments)
  }
});

function linkFn1($http, $timeout) {
  return function(scope, element, attrs) {
    // ...
  };
}
app.directive('bar', function($injector) {
  return {
    restrict: 'E', 
    link: linkFn2($injector)
  }
});

function linkFn2($injector) {
  var $http = $injector.get('$http'),
      $timeout = $injector.get('$timeout');

  return function(scope, element, attrs) {
    // ...
  };
}
这里的缺点是指令函数中参数的顺序很重要。如果其他指令使用不同的顺序,代码将无法正常工作

2)使用
$injector

app.directive('foo', function($http, $timeout) {
  return {
    restrict: 'E', 
    link: linkFn1.apply(null, arguments)
  }
});

function linkFn1($http, $timeout) {
  return function(scope, element, attrs) {
    // ...
  };
}
app.directive('bar', function($injector) {
  return {
    restrict: 'E', 
    link: linkFn2($injector)
  }
});

function linkFn2($injector) {
  var $http = $injector.get('$http'),
      $timeout = $injector.get('$timeout');

  return function(scope, element, attrs) {
    // ...
  };
}

谢谢-刚刚学到了一些新东西!我认为,
$injector
更灵活,更容易适应不断变化的需求。