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 has been in progress

你得到的那个错误意味着 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 回答