1

ウォッチャー関数で奇妙な問題が発生しています:

$scope.$watch('builder.editItemForm.quantity',function(newValue,oldValue){
    if(newValue !== oldValue){
        if(newValue % 2 == 0){
            builder.editItemForm.quantity = newValue;
        } else {
            builder.editItemForm.quantity = oldValue;
        }
    }
});

次のようにこのエラーが発生します。

Error: $rootScope:infdig Infinite $digest Loop

10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["builder.editItemForm.quantity;     newVal: 1; oldVal: undefined"],["builder.editItemForm.quantity; newVal: undefined; oldVal: 1"],["builder.editItemForm.quantity; newVal: 1; oldVal: undefined"],["builder.editItemForm.quantity; newVal: undefined; oldVal: 1"],["builder.editItemForm.quantity; newVal: 1; oldVal: undefined"]]

https://docs.angularjs.org/error/$rootScope/infdig?p0=10&p1=%5B%5B%22builder.editItemForm.quantity;%20newVal:%201;%20oldVal:%20undefined%22%5D,%5B%22builder.editItemForm.quantity;%20newVal:%20undefined;%20oldVal:%201%22%5D,%5B%22builder.editItemForm.quantity;%20newVal:%201;%20oldVal:%20undefined%22%5D,%5B%22builder.editItemForm.quantity;%20newVal:%20undefined;%20oldVal:%201%22%5D,%5B%22builder.editItemForm.quantity;%20newVal:%201;%20oldVal:%20undefined%22%5D%5D

これを回避する方法がわかりません。誰でも私を助けることができますか?

4

2 に答える 2

0

解決策の 1 つは、時計を調べて、数量を設定した後で時計の登録を解除しようとすることです。それは一度だけ働くでしょう。もう 1 つの方法は、ウォッチ イベントと同じことを行う ng-model-options getterSetter を使用することです。

1) 状況によっては、監視イベントの登録を解除できます。コントローラーで:

$scope.$watch('updated', function(newValue,oldValue){
      $scope.stop();
});
$scope.stop = $scope.$watch('builder.editItemForm.quantity',function(newValue,oldValue){
        if(newValue !== oldValue){
            if(newValue % 2 == 0){
                builder.editItemForm.quantity = newValue;
                $scope.updated = true;
            }
            else
            {
                builder.editItemForm.quantity = oldValue;
                $scope.updated = true;
            }
        }
    });

$scope.$watch は、呼び出されたときに監視を停止する関数を返します。これは、登録解除と呼ばれます。ここではまだ再発ですが、うまくいくかもしれません。

別のより一般的な解決策は、ng-model-options ゲッターとセッターを使用することです。あなたの見解では:

ng-model="quantity" ng-model-options="{ getterSetter: true; }"

そしてコントローラでgetter と setter を定義します:

于 2015-07-08T11:38:02.167 に答える
0

ウォッチ内で値builder.editItemForm.quantityを変更しているため、再びダイジェスト サイクルが実行され、ウォッチは値が変更されたときに常にトリガーされます。あなたの状況では、無限ループに陥るウォッチ内の値を変更しています。

説明

このエラーは、アプリケーションのモデルが不安定になり、各 $digest サイクルが状態の変化とそれに続く $digest サイクルをトリガーするときに発生します。Angular はこの状況を検出し、無限ループによってブラウザーが応答しなくなるのを防ぎます。

たとえば、パスにウォッチを設定し、その後値が変更されたときに同じパスを更新すると、状況が発生する可能性があります。

$scope.$watch('foo', function() {
  $scope.foo = $scope.foo + 1;
});

ドキュメントを参照して ください https://docs.angularjs.org/error/$rootScope/infdig

于 2015-07-08T11:20:40.937 に答える