web-dev-qa-db-ja.com

エラー:$ digestは既に進行中です

電話しようとするとこのエラーが発生します

        function MyCtrl1($scope, $location, $rootScope) {
      $scope.$on('$locationChangeStart', function (event, next, current) {
        event.preventDefault();
        var answer = confirm("Are you sure you want to leave this page?");
        if (answer) {
          $location.url($location.url(next).hash());
          $rootScope.$apply();
        }
      });
    }

MyCtrl1.$inject = ['$scope', '$location', '$rootScope'];

エラーは

Error: $digest already in progress
29
iJade

重複: $ scope。$ apply()の呼び出し時にエラー$ digestがすでに進行しているのを防ぐ

取得しているエラーは、Angularのダーティチェックが既に進行中であることを意味します。

最新のベストプラクティスでは、$timeout次のdigest反復でコードを実行する場合:

$timeout(function() {
  // the code you want to run in the next digest
});

前の応答:このアプローチを使用しないでください

次のような安全な適用を使用します。

$rootScope.$$phase || $rootScope.$apply();

どうして状態を逆転させないのですか?

$scope.$on('$locationChangeStart', function (event, next, current) {                
    if (confirm("Are you sure you want to leave this page?")) {
        event.preventDefault();
    }
});
61
bmleite

このエラーのトラブルシューティングを検討している他の人にとって、 docs$timeoutサービスは、コードが単一の$applyブロック。

$timeout(function() {
  $scope.someData = someData;
});

また、 この質問 で、受け入れられた回答を過ぎて見た場合も説明します。

12
aw04

つかいます

$scope.evalAsync(function(){ 
});

の代わりに

$scope.$apply(function(){
});
2

josliberの答えは、私が抱えていた同様の$ digest問題を解決しました。使ったばかり

$scope.$evalAsync(function(){ 
   // code here
});

良い記事はこちら https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm

1
user2217057

$ scope。$ apply()はAngularJs環境内にあるため、一般に$ apply()を使用することはお勧めしませんが、さらに$ rootScope。$ apply()関数を使用すると、アプリケーションの実行が遅くなります。スコープ全体の新しいサイクルを実行します。

0