我有一个翻译文本的函数,它钩在所有文本上,看起来像这样

$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

09-17 06:26