当我在模型中的一个属性改变时,我正在尝试发送一个表单(使用一个指令)(所以我观察该属性),但是当我触发submit事件时,我会收到错误:“Error:[$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循环运行(显然是看一个).所以你应该等到完成之后才能在下一个事件中提起事件.您可以为此提供$timeout服务:
app.directive("autoSubmit",function($timeout) {
return {
link: function(scope,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,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