答案主要在於JS域,尋找可重用代碼的模式是一個很好的挑戰。 Angular得到了extend
,copy
和merge
,但就這些,模塊和DI只是解決ES5限制的方法。
下面是關於如何從指令定義對象創建混合的提示。
app.directive('blockBase', function() {
return {
link: function (scope, element, attrs) {
scope.title = 'block';
}
};
});
app.directive('brickBase', function() {
return {
restrict: 'E',
scope: true,
link: function (scope, element, attrs) {
// ...
}
};
});
app.directive('block', function (blockBaseDirective, brickBaseDirective) {
var blockDirective = angular.extend(brickBaseDirective[0], {
name: 'brick',
restrict: 'EA',
scope: {
title: '='
}
});
blockDirective.compile = function (element, attrs) {
// ...
return {
post: function (scope, element, attrs) {
blockBaseDirective[0].link(scope, element, attrs);
scope.title += ' offspring';
}
};
};
return blockDirective;
});
你應該自己決定,如果這種方法看起來比裝飾者更好。
在控制器/指令定義之外使用命名函數是擺脫重複代碼的流行方式,而不是優雅的代碼。當然,您可以通過自定義DDO屬性在指令之間共享函數或類。但是,工廠仍然更適合。
你如何得到這個工作?當我嘗試這個時,我得到'未知的提供者'錯誤,似乎是當試圖注入一個指令到另一個指令時......這甚至可能嗎? – 2016-01-14 21:56:34
@JaredHales是的,這是可能的,Angular寄存器的'directiveName'指令爲'directiveNameDirective'服務。它是否被注入到其他指令或其他地方並不重要。如果您在代碼方面有問題,請隨時發佈問題。 – estus 2016-01-14 22:52:45