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


我正在尝试当模型中的属性发生更改时发送一个表单(使用指令)(所以我看属性),但是当我触发提交事件时,我收到错误:“错误:[$ 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)

在此先感谢您的帮助。


4229
2017-08-08 05:43


起源

我没有得到这样的错误 - pixelbits
你是否将文本框的值更改为1? - PachinSV
啊,是的,现在我明白了 - pixelbits


答案:


问题是已经有一个$ 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

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

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


12
2017-08-08 06:01



非常感谢@dfsq ...您是否看到使用任何这些实现​​的任何缺点或优势? - PachinSV
两种解决方案都很棒!你是天才,再次感谢。 - PachinSV
好吧,我不会硬编码价值 1 进入指令,它不是很灵活。 - dfsq
好吧,实际上这只是为了说明目的:P ...再次感谢。 - PachinSV
效果很好,但这个超时是否可以安全使用? - Jordan


当你启动一个进程并且不杀死它时你会收到摘要已经在进行中,为了解决这个问题,你必须使用$ timeout服务来杀死进程 在特定时间之后。


1
2017-07-17 07:56



虽然您的提示可能会有所帮助,但我建议您详细说明您的答案(使用您提到的方法提供一些代码)。最好的祝福。 - YakovL