我有3个过滤器,我需要为一个项目编写,所有3个都可以做同样的事情,但是与$ rootscope不同的数组(他们正在将数字状态转换为其显示值)。
如何编写此代码并从所有3个过滤器中调用它,然后将一个实例保存在MyFilters模块中?
我看不到可以放置该代码的地方。如果我正在写一项服务,我会有一个可以放入的块,但是有了过滤器,我没有那个共同的位置来编写代码。
现在,我刚刚将其移至全局范围,但是我想将其移至过滤器模块中,因此我不必重复3次或将其存储在全球范围中。
angular.module('myFilters', [])
.filter('aStatus', function($rootScope) {
return function(id, attr) {
var objectArray = $rootScope.appConfig.aStatuses,
index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
if(index < 0) {
return "";
}
if(attr) {
return objectArray[index][attr];
}
return objectArray[index];
};
})
.filter('bStatus', function($rootScope) {
return function(id, attr) {
var objectArray = $rootScope.appConfig.aStatuses,
index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
if(index < 0) {
return "";
}
if(attr) {
return objectArray[index][attr];
}
return objectArray[index];
};
})
.filter('cStatus', function($rootScope) {
return function(id, attr) {
var objectArray = $rootScope.appConfig.cStatuses,
index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
if(index < 0) {
return "";
}
if(attr) {
return objectArray[index][attr];
}
return objectArray[index];
};
});
为什么不将通用函数提取到服务中,而只需使用预沿objectArray
的过滤器调用它?
angular.module('myFilters', [])
.factory("StatusFilter", function ($rootScope) {
return function(objectArray, id, attr) {
var index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
if(index < 0) {
return "";
}
if(attr) {
return objectArray[index][attr];
}
return objectArray[index];
};
});
.filter('aStatus', function(StatusFilter, $rootScope) {
return function(id, attr) {
return StatusFilter($rootScope.appConfig.aStatuses, id, attr);
};
})
.filter('bStatus', function(StatusFilter, $rootScope) {
return function(id, attr) {
return StatusFilter($rootScope.appConfig.bStatuses, id, attr);
};
})
.filter('cStatus', function(StatusFilter, $rootScope) {
return function(id, attr) {
return StatusFilter($rootScope.appConfig.cStatuses, id, attr);
};
})
另外,您可以将该功能提取到过滤器中:
angular.module('myFilters', [])
.filter("Status", function ($rootScope) {
return function(objectArray, id, attr) {
var index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
if(index < 0) {
return "";
}
if(attr) {
return objectArray[index][attr];
}
return objectArray[index];
};
});
.filter('aStatus', function($filter, $rootScope) {
return function(id, attr) {
return $filter("Status")($rootScope.appConfig.aStatuses, id, attr);
};
})
.filter('bStatus', function($filter, $rootScope) {
return function(id, attr) {
return $filter("Status")($rootScope.appConfig.bStatuses, id, attr);
};
})
.filter('cStatus', function($filter, $rootScope) {
return function(id, attr) {
return $filter("Status")($rootScope.appConfig.cStatuses, id, attr);
};
})