如何进一步抽象具有太多重复逻辑的指令
How to further abstract directives that have too much duplicated logic
我正在处理一个代码库,其中多个指令使用本质上重复的逻辑,只有一个通过范围更改传递的对象。例如:
return {
restrict: 'A',
scope:{
someObject:"="
},
link: function( scope, element, attrs ) {
scope.getSomeObject = function(){
...
return scope.someObject.$$getSomeObject;
...
}
scope.saveSomeObject = function(){
...
scope.someObject.$$saveSomeObject();
...
}
scope.removeSomeObject = function(){
...
scope.someObject.$$removeSomeObject();
...
}
}
每个函数的逻辑都比较复杂,但本质上是我所展示的。通常,功能几乎完全相同,尽管偶尔会出现特殊情况。在我看来,指令的创建本质上似乎是为了解决每次都必须编写这段代码的问题,并且当发现错误时,必须在所有地方修复它。这些指令还在各自的 templateUrls 中复制了大部分(但不是全部)逻辑。什么是最明智的方式来写一次并一遍又一遍地用于各种object/cases?
如果你的意思是你想从指令中提取公共代码到一些共享的地方,我认为你应该开始使用服务..然后将它们注入你的指令
这看起来像是使用 'required' 指令的完美用例。
查看指令定义对象的 'require' 属性的文档。
例如,您可以定义一个名为 someObject
的指令,并在您的自定义指令中要求它。
<my-directive some-object="somethingOnParentScope"></my-directive>
在您的 myDirective
定义中,您会做类似
的事情
return {
restrict: 'A',
require: 'someObject',
link: function( scope, element, attrs, someObjectCtrl ) {
// if you need to make someObjectCtrl functionality available through templates,
// you will still need to add it to the scope
scope.someFunction = someObjectCtrl.someFunction;
}
我正在处理一个代码库,其中多个指令使用本质上重复的逻辑,只有一个通过范围更改传递的对象。例如:
return {
restrict: 'A',
scope:{
someObject:"="
},
link: function( scope, element, attrs ) {
scope.getSomeObject = function(){
...
return scope.someObject.$$getSomeObject;
...
}
scope.saveSomeObject = function(){
...
scope.someObject.$$saveSomeObject();
...
}
scope.removeSomeObject = function(){
...
scope.someObject.$$removeSomeObject();
...
}
}
每个函数的逻辑都比较复杂,但本质上是我所展示的。通常,功能几乎完全相同,尽管偶尔会出现特殊情况。在我看来,指令的创建本质上似乎是为了解决每次都必须编写这段代码的问题,并且当发现错误时,必须在所有地方修复它。这些指令还在各自的 templateUrls 中复制了大部分(但不是全部)逻辑。什么是最明智的方式来写一次并一遍又一遍地用于各种object/cases?
如果你的意思是你想从指令中提取公共代码到一些共享的地方,我认为你应该开始使用服务..然后将它们注入你的指令
这看起来像是使用 'required' 指令的完美用例。 查看指令定义对象的 'require' 属性的文档。
例如,您可以定义一个名为 someObject
的指令,并在您的自定义指令中要求它。
<my-directive some-object="somethingOnParentScope"></my-directive>
在您的 myDirective
定义中,您会做类似
return {
restrict: 'A',
require: 'someObject',
link: function( scope, element, attrs, someObjectCtrl ) {
// if you need to make someObjectCtrl functionality available through templates,
// you will still need to add it to the scope
scope.someFunction = someObjectCtrl.someFunction;
}