Angular 翻译函数被无限调用

Angular translation function gets called infinitely

我有一个翻译文本的功能,它与所有文本挂钩,看起来像这样

$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>

An expression that starts with :: is considered a one-time expression.
One-time expressions will stop recalculating once they are stable, which happens after the first digest if the expression result is a non-undefined value.

既然你想重新绑定你的文本,你将不得不做一些不同的事情:

<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

尝试使用过滤器,例如

<h1 style="text-align: center">{{ Name | customFilter}}</h1>
angular.module('yourApp')
  .filter('customFilter', ['Language', function(Language) {
    return function(key) {
      return Language.dict[key] || key;
    };
  }]);

你可以试试

 var Language = {dict: {Name: 'Name 1'}};
    $scope.visited = [];
    $rootScope.getWord = function(key) {
        if (angular.isDefined(Language.dict[key])) {
            $scope.visited[key] = Language.dict[key];
            return Language.dict[key];
        }
        $scope.visited[key] = key;
        return key;
    };

<span style="text-align: center">{{visited['Name']?visited['Name']:getWord('Name')}}</span>

当语言改变时,只清除访问过的对象。