31

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

        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
4

5 に答える 5

63

重複:$scope。$apply()を呼び出すときにすでに進行中のエラー$digestを防止します

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

最近のベストプラクティスでは、次のダイジェスト反復$timeoutでコードを実行する場合に使用する必要があるとされています。

$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();
    }
});
于 2013-02-12T17:26:56.027 に答える
13

このエラーのトラブルシューティングを検討している他の人にとっては、コードが単一のブロックで呼び出されるようにするためにサービスを使用することをドキュメントが提案しているように見えることに注意してください。$timeout$apply

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

あなたが受け入れられた答えを過ぎて見れば、この質問でも議論されます。

于 2014-08-06T18:19:10.460 に答える
2

使用する

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

それ以外の

$scope.$apply(function(){
});
于 2015-10-14T04:12:57.320 に答える
2

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

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

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

于 2016-11-18T20:35:44.770 に答える
0

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

于 2015-07-22T16:27:19.273 に答える