【问题标题】:Error: [$rootScope:inprog] $digest already in progress错误:[$rootScope:inprog] $digest 已经在进行中
【发布时间】:2014-10-01 12:48:10
【问题描述】:

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

这是他 plunk:http://plnkr.co/edit/cosJLkhUEKv55G8uU1Ea(要重现错误,只需将文本框的值更改为 1)

提前感谢您的帮助。

【问题讨论】:

  • 你把文本框的值改成1了吗?
  • 啊,是的,现在我明白了

标签: javascript angularjs angularjs-directive submit


【解决方案1】:

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

【讨论】:

  • 尽管您的提示可能会有所帮助,但我建议您详细说明您的答案(使用您提到的方法提供一些代码)。最好的问候。
【解决方案2】:

问题在于,当您尝试触发事件时,已经有一个 $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

【讨论】:

  • 非常感谢@dfsq...您看到使用这些实现的任何缺点或优点了吗?
  • 好吧,我不会将值 1 硬编码到指令中,它不是很灵活。
  • 好的,实际上这只是为了说明目的:P ...再次感谢。
  • 效果很好,但是这个超时可以安全使用吗?
  • @Jordan 是的,保证在下一个摘要周期会调用 $timeout 回调,所以是安全的。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2017-10-28
  • 2016-07-18
相关资源
最近更新 更多