有没有办法重新渲染AngularJS过滤器?我正在尝试使用角度货币过滤器,根据加载的语言文件显示货币符号。一旦我以编程方式加载相应的语言文件,我需要重新渲染过滤器。
答案 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)
在模板中,过滤器仅在输入时执行 改变。
因此,如果我们希望过滤器是无状态的,但是响应某些外部状态的变化,我们应该将此状态作为过滤器的输入。这个输入可以是纯虚拟的,与过滤器的内部逻辑没有任何关系,只是触发它的执行。
我最近遇到了这个问题,弄清楚如何在语言环境更改事件中动态重新生成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);
}
}