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);
当我提交表单时,我会进行一些后端验证以确保电子邮件是唯一的,如下所示:
$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
类.
话虽如此,让摘要自行完成而不是手动启动或调用它们通常是个好主意,除非您确实知道自己需要它。
在这种特殊情况下,我建议您在下一个摘要周期中调用 scrollToFirstError
。它可以简单地通过 $timeout
服务来实现。先注入它,然后用以下内容替换您的 scrollToFirstError()
调用:
$timeout(scrollToFirstError);