0

私は次のようng-repeatに考えています。

<div ng-repeat="field in fields">
  {{field.someValue}}
</div>

のコンテンツは、ビューに渡さfieldsれる前にある必要があります。preprocessedしたがって、コントローラーには、オブジェクトをループしてfieldsいくつかのキーを追加し、いくつかのキーを削除する関数があります。単純化された擬似コードは次のようになります

myApp.controller('FieldsController', function($scope) {
  $scope.fields = loadFieldsFromResource();
  var i=0;

 for(i = 0; i < $scope.fields.length; i++) {
   if ($scope.fields[i].someProperty > maxValue) {
     // Remove an item from the array
     $scope.fields.splice(i,1);
   } 
   else if ($scope.fields[i].someProperty < minValue) {
     // Add an item to the array
     $scope.fields.splice(i,0,createNewField());
   }
 }
})

これで正しい出力が生成されますが、10 $digest() iterations reached.エラーが発生します。どうすればそれを機能させることができますか?( init で行う前処理のみが必要です)。

fieldswithangular.copy()を一時変数にコピーしようとしました。前処理を行ってから変数に割り当てfieldsますが、それでも同じエラーが発生します。

preprocessingビューに与える前に、Angularウォッチの外でこの種のことを行う方法はありますか?

4

1 に答える 1

0

ng-init を使用できますか?

<div ng-init="processFields()" ng-repeat="field in fields">
  {{field.someValue}}
</div>

そして、コントローラーで次のことができます。

myApp.controller('FieldsController', function ($scope) {
    $scope.fields = [];

    $scope.processFields = function () {
        var fields = loadFieldsFromResource();
        var i = 0;

        for (i = 0; i < fields.length; i++) {
            if (fields[i].someProperty > maxValue) {
                // Remove an item from the array
                fields.splice(i, 1);
            }
            else if (fields[i].someProperty < minValue) {
                // Add an item to the array
                fields.splice(i, 0, createNewField());
            }
        }

        $scope.fields = fields;
    }
})

あなたの全体的な状況はわかりませんが、表示する前にロードしてソートする必要がある場所はほとんどありません.

于 2013-09-11T03:11:42.917 に答える