角度转换函数被无限调用

时间:2015-07-24 09:54:26

标签: javascript angularjs loops data-binding infinite

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

$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实例它仍然进入循环。

语言可以随时更改。

我做错了什么,解决方法是什么?

3 个答案:

答案 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();

语言更改时,只需清除访问过的对象。