gpt4 book ai didi

javascript - Angularjs 表单验证顺序

转载 作者:数据小太阳 更新时间:2023-10-29 05:58:00 25 4
gpt4 key购买 nike

我有一个包含常规文本输入的简单 html 表单。 ng-minlengthng-maxlengthng-pattern Angular built-in form input directives在输入上设置。

问题:ng-pattern 检查在 ng-minlengthng-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>

当前行为:

  • 输入“#”——查看“模式错误”
  • 输入“###”——查看“模式错误”

期望的行为:

  • 输入“#”——见“长度错误”
  • 输入“###”——查看“模式错误”

仅供引用,相关 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);
}
}
});

然后在您的 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>

该指令使用 my-minlength、my-maxlength 和 my-pattern 作为这三个值。如果 length 失败,那将首先跳闸。如果不是,则模式不匹配时将显示为错误。如果您想在除名称之外的其他地方使用它,请考虑重命名该指令,因为可以通过属性将其传递给最小长度、最大长度和模式。如果它们被遗漏,它们将被忽略。

参见 jsfiddle:http://jsfiddle.net/4zpxk/6/

关于javascript - Angularjs 表单验证顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com