Angularjs 在跨多个指令共享的链接函数中添加角度相关性
我有几个指令使用相同的链接函数。(link函数根据用例添加了一些额外的状态和html。)因此我声明如下:Angularjs 在跨多个指令共享的链接函数中添加角度相关性,angularjs,Angularjs,我有几个指令使用相同的链接函数。(link函数根据用例添加了一些额外的状态和html。)因此我声明如下: function common_linkfunc(){...} var Directive_1 = function($scope, etc) { return {restrict:"E", ... link: common_linkfunc, controller: function($scope, etc) {...} }; }
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
更灵活,更容易适应不断变化的需求。