zoukankan      html  css  js  c++  java
  • [AngularJS] AngularJS系列(3) 中级篇之表单验证

    目录

    基本验证

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <form name="form" novalidate ng-app>
        <span>{{form.$invalid}}</span>
        <span>{{form.$valid}}</span>
        <span>{{form.$dirty}}</span>
        <span>{{form.$pristine}}</span>
        <input type="text" ng-model="user" required />
        <input type="text" ng-model="pwd" required minlength="4" ng-maxlength="5" />
        <input type="text" ng-model="phone" required ng-pattern="/1[3|5|7|8|][0-9]{9}/" />
        <input type="email" ng-model="email" required />
        <input type="url" ng-model="url" required />
        <input type="number" ng-model="number" required />
        <div>
            <button type="reset" ng-disabled="form.$pristine">重置</button>
            <button type="submit" ng-disabled="form.$invalid">提交</button>
        </div>
    </form>

    以上展示了基本的ng验证.

    这里重点介绍一下上面的特例:

    novalidate:   禁用H5自带的验证

    ng-maxlength: 如果不写ng,maxlength则直接限制最多输入字符,稍微有点区别(IE9 + Chrome 测试)

    ng-pattern:  通过正则验证,如果不写ng开头,无验证效果.

    注:要启用验证 同时需要绑定一个ng-model

    属性类   描述
    $valid ng-valid Boolean 告诉我们这一项当前基于你设定的规则是否验证通过
    $invalid ng-invalid Boolean 告诉我们这一项当前基于你设定的规则是否验证未通过
    $pristine ng-pristine Boolean 如果表单或者输入框没有使用则为True
    $dirty ng-dirty Boolean 如果表单或者输入框有使用到则为True

    访问表单属性

    • 方位表单: <form name>.<angular property>

    • 访问一个输入框: <form name>.<input name>.<angular property>

    验证插件

    在介绍messages插件之前,我们看下本来的验证提示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <form name="form" ng-app novalidate>
        <span>{{form.user.$error.required?'user该项必填':''}}</span>
        <input type="text" ng-model="user" name="user" required />
        <span>{{form.pwd.$error.required?'pwd该项必填':''}}</span>
        <input type="text" ng-model="pwd" name="pwd" required />
        <span>{{form.info.$error.required?'info该项必填':''}}</span>
        <input type="text" ng-model="info" name="info" required />
        <span>{{form.age.$error.required?'age该项必填':''}}</span>
        <input type="text" ng-model="age" name="age" required />
        <div>
            <button type="submit" ng-disabled="form.$invalid">提交</button>
        </div>
    </form>

    这里只是判断了require 当我们的代码 我们重复写了很多3元表达式

    messages插件就是更友好的解决重复的问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <form name="form" ng-app="myApp" novalidate>
        <input type="email" ng-model="user" name="username" required minlength="4" />
        <div ng-messages="form.username.$error" ng-messages-multiple>
            <div ng-message="required">该项必填</div>
            <div ng-message="minlength">低于最低长度</div>
            <div ng-message="email">应为email</div>
        </div>
    </form>
    <script src="Scripts/angular.min.js"></script>
    <script src="Scripts/angular-messages.min.js"></script>
    <script>
        angular.module('myApp', ['ngMessages']);
    </script>

    Nuget:Install-Package AngularJS.Messages 

    自定义验证

    通过基本的验证方式,我们已经能够解决大部分的验证问题.但项目中永远充满着各种各样的需求.

    在ng中的自定义验证,一般通过指令的形式创建.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form name="form" ng-app="myApp" novalidate>
        <input type="email" ng-model="user" name="username" required ensure-unique minlength="4" />
        <div ng-messages="form.username.$error" ng-messages-multiple>
            <div ng-message="required">该项必填</div>
            <div ng-message="minlength">低于最低长度</div>
            <div ng-message="email">应为email</div>
            <div ng-message="unique">用户名已存在</div>
        </div>
    </form>

    在上面的messages插件Demo中,新建一行验证用户名已存在 以及 在input上添加了ensure-unique指令

    同时,我们需要在js中定义ensure-unique指令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    angular.module('myApp', ['ngMessages']).directive('ensureUnique', ['$http''$timeout''$window'function ($http, $timeout, $window) {
                return {
                    restrict: "A",
                    require: 'ngModel',
                    link: function (scope, ele, attrs, ngModelController) {
                        scope.$watch(attrs.ngModel, function (n) {
                            if (!n) return;
                            $timeout.cancel($window.timer);
                            $window.timer = $timeout(function () {
                                $http({
                                    method: 'get',
                                    url: '/api/checkusername/'//根据换成自己的url
                                    params: {
                                        "username": n
                                    }
                                }).success(function (data) {
                                    ngModelController.$setValidity('unique', data.isUnique); //这个取决于你返回的,其实就是返回一个是否正确的字段,具体的这块可以自己修改根据自己的项目
                                }).error(function (data) {
                                    ngModelController.$setValidity('unique'false);
                                });
                            }, 500);
                        });
                    }
                };
            }]);

    指令不是本节重点内容,这里简单说下

    ngModelController.$setValidity('unique', bool);

    通过该API可以设置$error.unique.

    setValidity为true,则$error.unique为false

  • 相关阅读:
    js处理富文本编辑器转义、去除转义、去除HTML标签
    web sec tools / Arachni
    OS + Linux IP / Inside IP / Outside IP
    OS + Linux SMB / Samba
    OS + Linux NTP Server
    my live / PC NAS / weiliantong QNAP TS-532X 4.5.1.1495 / cipanzhenlie / raid / Synology
    summarise() regrouping output 警告
    binary_crossentropy和BinaryCrossentropy的区别
    损失函数BinaryCrossentropy例子说明
    理解功能强大的sed替换命令
  • 原文地址:https://www.cnblogs.com/yyy6/p/5916333.html
Copyright © 2011-2022 走看看