错误:[$rootScope:inprog] $digest已经在进行中

Error: [$rootScope:inprog] $digest already in progress

本文关键字:digest 进行中 inprog rootScope 错误      更新时间:2023-09-26

我正在尝试发送一个表单(使用指令)当模型中的属性发生变化时(所以我观察属性),但是当我触发提交事件时,我得到错误:"错误:[$rootScope:inprog] $digest已经在进行中",我怎么能避免这个错误,这是我的代码:

app.directive("autoSubmit", function(){
  return {
    link: function(scope, element, attrs){
      scope.$watch("valid", function(){ 
        if(scope.valid == 1) {
          console.log("send form");
          element.triggerHandler("submit");
        }
      });
    }
  }
});

结果如下:http://plnkr.co/edit/cosJLkhUEKv55G8uU1Ea(要重现错误,只需将文本框的值更改为1)

提前感谢您的帮助。

问题是,当您尝试触发事件时,已经有一个$digest周期在运行(显然是watch周期)。因此,您应该简单地等待,直到它完成并在下一个过程中引发该事件。您可以使用$timeout服务:

app.directive("autoSubmit", function($timeout) {
    return {
        link: function(scope, element, attrs) {
            scope.$watch("valid", function() {
                if (scope.valid == 1) {
                    console.log("send form");
                    $timeout(function() {
                        element.triggerHandler('submit');
                    })
                }
            });
        }
    }
});

演示:http://plnkr.co/edit/bRXfi9kFVFICgFUFvtZz?p=preview

另一种方法是使用$parse服务手动调用ngSubmit函数:

app.directive("autoSubmit", function($parse) {
    return {
        link: function(scope, element, attrs) {
            scope.$watch("valid", function() {
                if (scope.valid == 1) {
                    console.log("send form");
                    var submitHandler = $parse(attrs.ngSubmit)(scope);
                    if (submitHandler) {
                        submitHandler();
                    }
                }
            });
        }
    }
});

演示:http://plnkr.co/edit/vNI8OwfnxSQJ6tQLpFqZ?p=preview

当你启动一个进程而不杀死它时,你收到的摘要已经在进行中,为了解决这个问题,你必须使用$timeout service杀死进程具体时间后。