答案主要在于 JS 领域,寻找可重用代码的模式是一个很好的挑战。 Angular 得到了 extend、copy 和 merge,但仅此而已,模块和 DI 只是绕过 ES5 限制的方法。
这里是关于如何从指令定义对象创建 mixin 的提示。
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 属性的指令之间共享函数或类。但是,工厂仍然更适合。