【问题标题】:Error: $digest already in progress错误:$digest 已经在进行中
【发布时间】:2013-01-28 02:12:26
【问题描述】:

我在尝试调用时遇到此错误

        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

【问题讨论】:

标签: javascript angularjs angularjs-directive


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用

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

    而不是

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

    【讨论】:

    • 它有效,但我不得不使用 $scope.$evalAsync(function(){ });
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      您遇到的错误意味着 Angular 的脏检查已经在进行中。

      最近的最佳实践表明,如果我们想在下一次 digest 迭代中执行任何代码,我们应该使用 $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();
          }
      });
      

      【讨论】:

      • 更新了我的整个代码......它现在没有显示错误但它没有达到目的,进入下一个视图
      • 它是否通过if (answer) { 条件? next的内容是什么?
      • 控制台是否出现任何错误?是否有任何 HTTP 请求发出?
      • 为了防止 JS lint 错误,使用这个: if (!$scope.$$phase) { $scope.$apply(); }
      • 根据项目,你不应该使用 $$phase 因为它会在未来消失并且会破坏你的代码。 github.com/angular/angular.js/wiki/Anti-Patterns 相反,只需将您认为需要安全应用的任何内容包装在 $timeout 中即可。它将在当前摘要周期之后安全地应用。
      【解决方案5】:

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

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

      如果您看过去接受的答案,也会在this question 中讨论。

      【讨论】:

      • 我遇到了同样的错误,但仅使用这段代码就解决了这个问题。你能告诉我这是如何工作的吗?
      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多