2014-03-24 146 views
2

我做了一个过滤器,用翻译替换一个关键字。只能运行一次的过滤器?

<label>{{'city' | translate}}</label> 

过滤器简单地查找在JSON文件的关键city和返回值。

我没有意识到的是过滤器运行...很多。经过一番研究,我发现有更好的方法可以做到这一点,但我不愿意做一个完整的重构。

我该如何告诉这个过滤器只能运行一次?

作为解决方法,我预先编译模板并用正确的字符串替换translate调用。这适用于大多数情况,但有些地方,关键是动态或翻译是一种功能

<label>{{'greeting' | translate:firstName:lastName}}</label> 

我想角到需要范围变量作为自变量只是做一次更换这些,从来没有去想它再次。

+0

添加你的过滤器定义的问题。 – Stewie

+0

你可以看一下角度 - 一次,这是设计不设置观察者:https://github.com/tadeuszwojcik/angular-once – Jorg

+0

@Stewie它的专有,但所有过滤器运行非常消化,如果我了解他们正确。具体实施是否会影响运行频率? –

回答

1

我想角度只是做一次性替换这些,不要再考虑它。

这有点含糊不清。范围变量如何改变?你想让过滤器每次运行时都运行吗?或者你真的认为,当DOM第一次编译时,范围变量的任何值都应该传递给过滤器,评估并静态设置为DOM?如果是后者,我建议angular-bindonce,它提供了从示波器到DOM的无时钟绑定。

添加模块依赖于你的应用程序后,标记看起来像:

<label bo-text="city|translate"</label>

+0

我想你已经正确理解了我的意图:没有看守。 –

+0

即使您使用每次实例化时都执行一次的指令,每当您的控制器重新加载时它都会重新启动。 –

+0

@DanKanze - 在什么情况下你想象的控制器会重新加载? – jelinson

3

翻译对象值本身它返回到您的视图之前:

$scope.city = city.$translate(); 

没有运行过滤器,每次这样,你重装模板或ng-repeat

<label>{{city}}</label> 
+0

谢谢,但这不可行。我无法为数百种翻译做到这一点。我将不得不提取每个模板中使用的翻译并将它们添加到控制器中。名称冲突将是一个巨大的麻烦,他们不会为ng-repeats中发生的复杂事件工作。 –

+0

我感到你的痛苦,它是很多工作,但你会将它们添加到服务而不是控制器 - 这就是这些事情的目的。您可以有效地运行数千个翻译,而不会影响性能,因为它只是一个关键名称查​​找。你能详细描述为什么这对'ng-repeat'不起作用吗? –

+0

它不起作用,因为控制器不一定知道视图需要哪些翻译。我可以首先在控制器中迭代数据,但这不是我正在寻找的解决方案。如果可以避免的话,我特别不想重构我的项目。 –