ale*_*cxe 5 javascript forms validation angularjs angular-directive
我有一个包含常规文本输入的简单html表单.ng-minlength,ng-maxlength并在输入上设置ng-pattern角度内置表单输入指令.
问题:ng-pattern检查是否在长度检查之前应用ng-minlength和ng-maxlength.
问题:如何更改默认检查顺序:即首先检查长度,然后应用模式检查?
例:
<body ng-app>
<div>
<form name="myForm">
Name: <input name="name" type="text" ng-model="name" ng-minlength="3" ng-maxlength="16" ng-pattern="/^\w+$/"/>
<div ng-show="myForm.name.$dirty && myForm.name.$invalid">
<span ng-show="myForm.name.$error.pattern">Pattern error</span>
<span ng-show="myForm.name.$error.minlength || myForm.name.$error.maxlength">Length error</span>
</div>
<br/>
<input type="submit" value="Submit">
</form>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
目前的行为:
期望的行为:
仅供参考,相关的jsfiddle.
提前致谢.
编写自己的指令:
var mod = angular.module("myApp", []);
mod.directive("nameValidation", function () {
return {
restrict: "A",
require: "ngModel",
link: function (scope, element, attrs, ngModelCtrl) {
var validate = function (value) {
var minLen = parseInt(attrs.myMinlength, 10),
maxLen = parseInt(attrs.myMaxlength, 10),
pattern = attrs.myPattern,
match = pattern.match(/^\/(.*)\/([gim]*)$/),
lenErr = false;
if (match) {
pattern = new RegExp(match[1], match[2]);
}
if (!ngModelCtrl.$isEmpty(value)) {
ngModelCtrl.$setValidity("pattern", true);
if ((minLen && value.length < minLen) || (maxLen && value.length > maxLen)) {
ngModelCtrl.$setValidity("length", false);
lenErr = true;
}
else {
ngModelCtrl.$setValidity("length", true);
lenErr = false;
}
if (!lenErr) {
if (match && !pattern.test(value)) {
ngModelCtrl.$setValidity("pattern", false);
}
else {
ngModelCtrl.$setValidity("pattern", true);
}
}
}
else {
ngModelCtrl.$setValidity("length", true);
ngModelCtrl.$setValidity("pattern", true);
}
}
ngModelCtrl.$parsers.push(validate);
ngModelCtrl.$formatters.push(validate);
}
}
});
Run Code Online (Sandbox Code Playgroud)
然后在您的HTML中,包含应用程序并使用该指令:
<body ng-app="myApp">
<div>
<form name="myForm">
Name: <input name="name" type="text" ng-model="name" name-validation="" my-minlength="3" my-maxlength="16" my-pattern="/^\w+$/"/>
<div ng-show="myForm.name.$dirty && myForm.name.$invalid">
<span ng-show="myForm.name.$error.pattern">Pattern error</span>
<span ng-show="myForm.name.$error.length">Length error</span>
</div>
<br/>
<input type="submit" value="Submit">
</form>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
该指令使用my-minlength,my-maxlength和my-pattern作为三个值.如果长度失败,那将首先跳闸.如果不匹配,那么如果模式不匹配,则模式将显示为错误.如果你想在名称以外的地方使用它,可以考虑重命名这个指令,因为minlength,maxlength和pattern可以通过属性传递给它.如果他们被取消,他们将被忽略.
见jsfiddle:http://jsfiddle.net/4zpxk/6/
| 归档时间: |
|
| 查看次数: |
6933 次 |
| 最近记录: |