【问题标题】:Initialising function in Angular filterAngular过滤器中的初始化函数
【发布时间】:2014-07-26 05:14:56
【问题描述】:

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

我这样做:

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

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

我想知道是否有更角度的方法来实现这一点?

谢谢

【问题讨论】:

标签: angularjs filter


【解决方案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

【讨论】:

    【解决方案2】:

    一般而言,数据应通过服务进行操作/获取/发送和共享。
    但是,如果您所指的“数据”是:

    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

    【讨论】:

    • 您能否确认每次调用该函数时数据未初始化正确?
    • 是的,你可以。这就是我在数据初始化后立即添加console.log 的原因。如果你打开 DevTools,你会看到它只被调用了一次。重复调用的是过滤器函数,而不是过滤器初始化函数。
    猜你喜欢
    • 2016-06-14
    • 2011-12-17
    • 1970-01-01
    • 2018-08-31
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-04-22
    相关资源
    最近更新 更多