如何重新渲染角度滤镜

时间:2014-01-03 08:39:59

标签: angularjs

有没有办法重新渲染AngularJS过滤器?我正在尝试使用角度货币过滤器,根据加载的语言文件显示货币符号。一旦我以编程方式加载相应的语言文件,我需要重新渲染过滤器。

3 个答案:

答案 0 :(得分:5)

来自Angular 1.3过滤器是无状态的,这意味着过滤器只会在他们的输入发生变化时更新。

如果您想要更新过滤器,则需要制作过滤器$stateful

app.filter('translate', translate);

translate.$inject = ['$rootScope'];

function translate($rootScope){

    filter.$stateful = true;

    return filter;

    function filter(str) {
        return i18n[$rootScope.currentLang][str];
    };
}

过滤器将在每个$ digest上执行,但这是perfm。

不可取的

答案 1 :(得分:0)

是。对于模板上的每个表达式,都有一个$ watch设置。过滤器是此$ watch评估的一部分,因此您只需要触发摘要周期。加载语言文件后,请确保调用$ scope。$ apply(),如果任何手表的最终结果发生变化,将重新运行所有手表并更新模板。

答案 2 :(得分:0)

Developer Guide/Filters文档说:

  

在模板中,过滤器仅在输入时执行   改变。

因此,如果我们希望过滤器是无状态的,但是响应某些外部状态的变化,我们应该将此状态作为过滤器的输入。这个输入可以是纯虚拟的,与过滤器的内部逻辑没有任何关系,只是触发它的执行。

我最近遇到了这个问题,弄清楚如何在语言环境更改事件中动态重新生成moment.js输出。这是我的过滤功能:

function FromNowFilter($moment) {
    return function (value, langKey, omitSuffix) {
        //langKey parameter is only used for triggering an update when language is changed
        return $moment(value).fromNow(omitSuffix);
    }
}