我有一个翻译文本的功能,它挂在所有文本上,看起来像这样
$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实例它仍然进入循环。
语言可以随时更改。
我做错了什么,解决方法是什么?
答案 0 :(得分:2)
在摘要循环的每次迭代中都会评估您使用的绑定({{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
答案 1 :(得分:0)
尝试使用过滤器,例如
<h1 style="text-align: center">{{ Name | customFilter}}</h1>
angular.module('yourApp')
.filter('customFilter', ['Language', function(Language) {
return function(key) {
return Language.dict[key] || key;
};
}]);
答案 2 :(得分:0)
你可以尝试
protected void onPostExecute(String result) {
System.out.println(historyitems.size());
// hisrecyclerview.addFooterView(btnLoadMore);
hisrecyclerview.notifyDataSetChanged();
}
};
}.execute();
和
hisrecyclerview.notifyDataSetChanged();
语言更改时,只需清除访问过的对象。