答案主要在于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