角度滤波器中的初始化函数

时间:2014-06-05 09:22:34

标签: angularjs filter

我正在编写一个自定义过滤器,需要初始化一些数据映射,以便每次调用过滤器时都不会创建数据映射。

我这样做:

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];
    }
}();

这意味着我定义我的过滤器的文件有一个实用程序函数,它使用一个闭包来关闭数据,该数据只初始化一次和一次。

我想知道是否有更有棱角的方法来实现这一目标?

由于

2 个答案:

答案 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