Angular setValidation 时应用摘要

Angular digest apply when setValidation

当我提交表单时,我会进行一些后端验证以确保电子邮件是唯一的,如下所示:

$http.post('/api/users.json', dataObj)
     .then (function() {
          // we are happy
      })
      .catch(function(response) {
           if(response.data.data.exception) {
                var emailNotUniqueException = 'App\Http\Exception\EmailNotUniqueException'; 
                $scope.userRegister.email.$setValidity("unique", false);
                scrollToFirstError();
            }
      }
);

scrollToFirstError 执行锡罐上所说的操作:

function scrollToFirstError () {
     var invalidInputs = angular.element('input.ng-invalid, select.ng-invalid');
     return invalidInputs.first().focus();
}

问题当然是,虽然我可以看到 ng-valid 已应用于输入,但我相信绑定丢失了。我阅读了范围摘要并应用,如果我添加其中之一,我会收到一条消息:

angular.js:14328 错误:[$rootScope:inprog] $digest 已经在进行中

我做错了什么?

将字段的有效性设置为无效后,必须等到应用当前摘要周期。如果您不这样做,当您查找 ng-invalid 类.

时,HTML 可能尚未更新

话虽如此,让摘要自行完成而不是手动启动或调用它们通常是个好主意,除非您确实知道自己需要它。

在这种特殊情况下,我建议您在下一个摘要周期中调用 scrollToFirstError。它可以简单地通过 $timeout 服务来实现。先注入它,然后用以下内容替换您的 scrollToFirstError() 调用:

$timeout(scrollToFirstError);