我正在编写一个自定义过滤器,需要初始化一些数据映射,以便每次调用过滤器时都不会创建数据映射。
我这样做:
myModule.filter("myfilter", function($filter) {
return function(letter) {
// ...
var blah = myOtherFunction(letter)
}
}
var myOtherFunction = function() {
// initialise some data
var myData = {
"a":"letterA"
"b":"letterB"
}
return function(letter) {
return myData[letter];
}
}();
这意味着我定义我的过滤器的文件有一个实用程序函数,它使用一个闭包来关闭数据,该数据只初始化一次和一次。
我想知道是否有更有棱角的方法来实现这一目标?
由于
答案 0 :(得分:1)
如果您的数据是静态的,只需创建一个新的模块/服务并将其注入您的过滤器:
myModule.filter('myfilter', ['myService', function(myService) {
return function(amount, currency) {
return myService.getLetter("a"); //don't know what you want to do here, using amount or currency I guess ?
};
}]);
myModule.factory('myService', function() {
var service = {};
var myData = {
"a":"letterA"
"b":"letterB"
}
service.getLetter = function (letter) {
return myData[letter];
}
return service;
});
如果您的数据是异步检索的,请按照以下帖子进行操作:Asynchronously initialize AngularJS filter
答案 1 :(得分:1)
通常,应该通过服务来操纵/提取/发送和共享数据 但是,如果你所指的“数据”是:
1。)静态和
2.)特定于过滤器的逻辑
然后我认为它不属于“应用数据”的一般类别;它是“过滤逻辑”的东西。
因此他们的位置恰好在过滤器中 (顺便说一句,为了只初始化它一次,你不需要那么复杂的“调用IIFE返回函数”的东西。只需将数据放在过滤器定义函数中(见下文)。)
app.filter("myFilter", function() {
var staticFilterSpecificData = {
"a": "letterA",
"b": "letterB"
};
console.log('Initialized only once !');
return function(letter) {
return staticFilterSpecificData[letter] || 'unknown';
};
});
另请参阅此 short demo 。