自定义验证指令覆盖其他验证
Custom validation directive overrides other validations
我已经创建了一个自定义验证,用于验证用户是否存在。如果用户不存在,则必须验证此验证。它是一个返回JSON内容的简单GET查询。
问题是这个验证似乎覆盖了其他验证。如果用户不,但小于3个字符,通常不应该验证字段,但它是!如果我删除我创建的自定义验证,问题就会消失,长度验证就会工作。
下面是我的代码:
angular.module('userRegistrationApp').directive('usernameNotExist', function($http) {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
ctrl.$parsers.unshift(function(viewValue){
var user = viewValue;
$http({method: 'GET', url: '/register/doesUserOrEmailExist/' + user }).
success(function(data, status, headers, config) {
if(data.doesUserOrEmailExist == false) {
ctrl.$setValidity('usernameNotExist', true);
return viewValue;
}else {
ctrl.$setValidity('usernameNotExist', false);
return undefined
}
}).error(function(data, status, headers, config) {
ctrl.$setValidity('usernameNotExist', false);
return undefined;
})
});
}
}
});
<input type="text" id="sonata_user_registration_form_username" name="sonata_user_registration_form[username]" required="required" maxlength="255" pattern=".{2,}" class="form-control" username-not-exist="" ng-minlength="3" ng-focus="setFocus('username')" ng-model="userRegistrationService.username">
我完全按照他们在文档中所说的去做,但是我得到了这个错误!
我想我已经找到解决办法了。它的灵感来自这个答案:https://stackoverflow.com/a/12865401/2573319
试试下面的指令,看看它是否适合你!
angular.module('userRegistrationApp').directive('usernameNotExist', function($http) {
var timeout;
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
scope.$watch(attrs.ngModel, function(value) {
var user = value;
// if there was a previous attempt, stop it.
if(timeout)
clearTimeout(timeout);
// start a new attempt with a delay to keep it from
// getting too "chatty".
timeout = setTimeout(function(){
// call to some API that returns { isValid: true } or { isValid: false }
$http({method: 'GET', url: '/register/doesUserOrEmailExist/' + user }).success(function(data) {
if(data.doesUserOrEmailExist == false) {
ctrl.$setValidity('usernameNotExist', true);
}
else {
ctrl.$setValidity('usernameNotExist', false);
}
}).error(function(data) {
ctrl.$setValidity('usernameNotExist', false);
});
}, 200);
})
}
}
});
我有同样的问题,发现解决方案是使用
不是
scope.$watch
ctrl.$parsers.unshift
在我看来,ctrl.$parsers.unshift
将使您的自定义验证在其他验证之前执行,然后如果您的自定义验证失败,return undefined;
将将模型值设置为未定义,以便其他验证将没有有效值来处理。
scope.$watch
将在所有其他验证通过后触发您的自定义验证。
我还没有在angular文档中找到支持这个的东西,这是基于我的调试经验。
相关文章:
- 如何在Javascript中验证日期期间与其他日期期间的交叉
- 输入类型=文件验证停止其他输入类型验证
- 停止jQuery表单验证重置由其他JavaScript填充的typeahead.js输入字段
- ASP.net控件中的其他客户端验证
- AngularJS客户端验证:根据其他字段更改验证要求
- 表单验证io表单验证.如果“;“其他”;,请解释
- 如果 e.keyCode 是“输入”按钮,并且元素包含其他文本,则验证条件
- 在第一个服务器验证失败响应上中止其他上传
- j查询验证模糊文本区域与其他输入问题
- 从一个 CSHTML 页面的 JavaScript 验证值来检查其他 CSHTML 页面
- Reg Ex 不会验证我是否将 # 与其他字符或数字一起使用
- JQuery 验证 <选择> min取决于其他字段,不起作用
- Javascript Regex?或其他方法来验证正确的文本输入
- 包含多个文件和其他输入字段的表单验证
- JavaScript表单提交验证会干扰其他提交按钮
- 如何在其他控制器中验证会话后访问会话用户名
- 验证其他字段后创建条带支付令牌
- Jquery.Valide文件上传绕过其他字段的验证
- 在没有
- 如果Select2字段为空,则LiveValidation提交表单而不验证其他字段