错误:$ digest已在进行中

时间:2013-02-12 17:23:57

标签: javascript angularjs angularjs-directive

我在尝试拨打

时遇到此错误
        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

5 个答案:

答案 0 :(得分:61)

重复:Prevent error $digest already in progress when calling $scope.$apply()

您获得的错误意味着Angular的脏检查已在进行中。

如果我们想要在下一个摘要迭代中执行任何代码,最近的最佳做法会说我们应该使用$timeout

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

之前的回复:don't use this approach

使用安全申请,如下所示:

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

你为什么不改变病情?

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

答案 1 :(得分:12)

对于其他希望解决此错误的人,值得注意的是docs似乎建议使用$timeout服务来确保代码将在单个{{1}中调用阻止。

$apply

如果您查看已接受的答案,也会在this question中进行讨论。

答案 2 :(得分:2)

使用

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

而不是

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

答案 3 :(得分:1)

josliber的答案解决了我遇到的类似$ digest问题。我刚用过

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

这里有好文章 https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm

答案 4 :(得分:0)

因为你的$ scope。$ apply()在 AngularJs环境里面。一般来说我不会建议你使用$ apply(),而且还需要$ rootScope。$ apply()函数让你的应用程序运行缓慢。它运行整个范围的新周期。