Angularjs 表单验证顺序

2024-04-20

我有一个简单的 html 表单,其中包含常规文本输入。ng-minlength, ng-maxlength and ng-pattern有角的内置表单输入指令 http://docs.angularjs.org/api/ng/directive/input在输入上设置。

问题:ng-pattern检查在长度检查之前应用ng-minlength and ng-maxlength.

问题:如何更改默认检查顺序:即首先检查长度,然后应用模式检查?

Example:

<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 http://jsfiddle.net/4zpxk/.

提前致谢。


编写您自己的指令:

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 失败,那将首先跳闸。如果不匹配,则模式将显示为错误(如果不匹配)。如果您想在名称之外的其他地方使用该指令,请考虑重命名该指令,因为 minlength、maxlength 和pattern 可以通过属性传递给它。如果他们被忽视,他们就会被忽视。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angularjs 表单验证顺序 的相关文章

随机推荐