Angularjs 如何重新渲染角度过滤器
有没有办法重新渲染AngularJS过滤器?我试图使用角度货币过滤器,根据加载的语言文件显示货币符号。以编程方式加载相应的语言文件后,我需要重新呈现过滤器。是。对于模板上的每个表达式,都有$watch设置。过滤器是这个$watch评估的一部分,所以您只需要触发一个摘要周期。加载语言文件后,请确保调用$scope.$apply(),如果任何监视的最终结果发生更改,它将重新运行所有监视并更新模板。文档中说: 在模板中,过滤器仅在其输入已更改时执行 变了 因此,如果我们希望过滤器是无状态的,但响应某些外部状态的更改,我们应该将此状态作为过滤器的输入。该输入可以是纯虚拟的,与过滤器的内部逻辑无关,只触发其执行 我最近遇到了这样一个问题:如何在区域设置更改事件上动态地重新呈现moment.js输出。这是我的过滤功能:Angularjs 如何重新渲染角度过滤器,angularjs,Angularjs,有没有办法重新渲染AngularJS过滤器?我试图使用角度货币过滤器,根据加载的语言文件显示货币符号。以编程方式加载相应的语言文件后,我需要重新呈现过滤器。是。对于模板上的每个表达式,都有$watch设置。过滤器是这个$watch评估的一部分,所以您只需要触发一个摘要周期。加载语言文件后,请确保调用$scope.$apply(),如果任何监视的最终结果发生更改,它将重新运行所有监视并更新模板。文档中说: 在模板中,过滤器仅在其输入已更改时执行 变了 因此,如果我们希望过滤器是无状态的,但响应某些
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];
};
}