Ошибка: [$ 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");
        }
      });
    }
  }
});

Heres is it plunk: http://plnkr.co/edit/cosJLkhUEKv55G8uU1Ea (чтобы воспроизвести ошибку, просто измените значение текстового поля на 1)

Заранее благодарим за помощь.

Ответ 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

Другим способом является вызов функции 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

Ответ 2

когда вы запускаете процесс и не убиваете его, вы получаете дайджест, который уже выполняется, для решения этой проблемы вы должны убить процесс, используя $timeout service после определенного времени.