我有一个翻译文本的函数,它钩在所有文本上,看起来像这样
$rootScope.getWord = function (key) {
if (angular.isDefined(Language.dict[key])) {
return Language.dict[key];
}
return key;
};
这是它如何连接到视图中的方法:
<h1 style="text-align: center">{{getWord('Name')}}</h1>
问题是它无限次地调用getWord,即使每个视图只有一个getWord实例,它仍然会陷入循环。
语言可以随时更改。
我在做什么错,如何解决?
最佳答案
摘要循环的每个单次迭代都会评估您使用的绑定({{getWord('Name')}}
)。将此乘以页面上getWord
个调用的数量...
为防止这种情况,请使用“ one-time binding”:
<h1 style="text-align: center">{{::getWord('Name')}}</h1>
以
::
开头的表达式被视为一次性表达式。一次性表达式一旦稳定就会停止重新计算,如果表达式结果为非不确定值,则在第一次摘要后会发生。
由于您希望能够重新绑定文本,因此您将需要做一些不同的事情:
<h1 style="text-align: center">{{translated.Name}}</h1>
然后,在控制器中,您将必须用所有翻译内容填充
$scope.translated
对象。如果更改语言,则可以再次触发获取翻译的功能。就像是:
$scope.translate = function(keys){
someTranslationWebService.get(keys, function(response){
$scope.translated = response;
});
};
其中
keys
可以是如下数组:['Name', 'CompanyName', 'Address']
response
应该是这样的对象:{
"Name": "Recipient's name",
"CompanyName": "Company name",
"Address": "Delivery address"
}
另一个选择是使用"angular-translate" library