我继承的应用程序正在使用angular-auto-validate
处理表单验证。我只是收到一个要求,我们需要能够处理诸如regex之类的输入特定的验证消息,而标准“您的输入必须符合/ some-pattern /”将无法使用。通常,我会为此使用ng-message
,但似乎不适用于angular-auto-validate
。
我所做的是这样:
/**
Looks up defined validations for the given input and dynamically applies
The appropriate directive for the defined validation.
*/
var validate = function (WizardDataService, $compile, defaultErrorMessageResolver) {
return {
priority: 1000,
link: function (scope, element, attrs) {
// check if we have a custom message
function check_error(type, message){
if( message ){
defaultErrorMessageResolver.getErrorMessages()
.then(function(errorMessages){errorMessages[type]=message})
}
};
element.removeAttr('validation');
WizardDataService
.getValidations(scope.qid) // returns { validation_type, error_msg, addl_info }
.then(function(data){
angular.forEach(data, function(value, i) {
switch(value.validation_type) {
case 'Numeric':
check_error('number', value.err_msg);
attrs.$set('type', 'number');
break;
case 'Email Address':
check_error('email', value.err_msg);
attrs.$set('type', 'email');
break;
case 'Regex':
check_error('pattern', value.err_msg);
attrs.$set('ng-pattern', new RegExp(value.addl_info))
break;
case 'Min Length':
check_error('minlength', value.err_msg);
attrs.$set('ng-minlength', value.addl_info)
break;
case 'Max Length':
check_error('maxlength', value.err_msg);
attrs.$set('ng-maxlength', value.addl_info)
break;
case 'Phone Number':
check_error('pattern', value.err_msg);
attrs.$set('ng-pattern', /^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$/)
break;
case 'Mandatory':
attrs.$set('ng-required', true)
break;
default:
break;
};
});
$compile(element)(scope);
});
},
scope: {
qid: '@'
},
}
};
问题是check_error
函数更改具有该验证类型的每个输入的错误消息。因此,例如,如果我有多个需要进行正则表达式验证的输入,那么两个输入都不会有自己的消息。