Angularjs 如何重新渲染角度过滤器

Angularjs 如何重新渲染角度过滤器,angularjs,Angularjs,有没有办法重新渲染AngularJS过滤器?我试图使用角度货币过滤器,根据加载的语言文件显示货币符号。以编程方式加载相应的语言文件后,我需要重新呈现过滤器。是。对于模板上的每个表达式,都有$watch设置。过滤器是这个$watch评估的一部分,所以您只需要触发一个摘要周期。加载语言文件后,请确保调用$scope.$apply(),如果任何监视的最终结果发生更改,它将重新运行所有监视并更新模板。文档中说: 在模板中,过滤器仅在其输入已更改时执行 变了 因此,如果我们希望过滤器是无状态的,但响应某些

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

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

文档中说:

在模板中,过滤器仅在其输入已更改时执行 变了

因此,如果我们希望过滤器是无状态的,但响应某些外部状态的更改,我们应该将此状态作为过滤器的输入。该输入可以是纯虚拟的,与过滤器的内部逻辑无关,只触发其执行

我最近遇到了这样一个问题:如何在区域设置更改事件上动态地重新呈现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);
    }
}

从Angular 1.3开始,过滤器是无状态的,这意味着过滤器只会在其输入发生更改时更新

如果你想更新你的过滤器,你需要做你的过滤器


过滤器将在每个$digest上执行,但perfm不建议这样做。

我建议使用
$timeout
服务,而不是
$scope.$apply
。您能否详细说明为什么会首选该服务$超时只会延迟$scope.$apply(),直到浏览器呈现线程获得控制。这似乎没有必要。在某些情况下,
$scope.$apply
会导致TTL错误。但更改为
$timeout
不会成功,因为它将创建新的$digest循环。如果我在这件事上错了,请纠正我。感谢在出现$apply()已在进行的错误的情况下,这意味着您根本不需要使用$apply(),因为已经有一个摘要循环正在发生。超时代价高昂,因为它会触发额外的摘要周期。它不应该被滥用。
app.filter('translate', translate);

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

function translate($rootScope){

    filter.$stateful = true;

    return filter;

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