AngularJS自定义表单验证功能实例详解


Posted in Javascript onAugust 24, 2018

本文实例讲述了AngularJS自定义表单验证功能。分享给大家供大家参考,具体如下:

Angular实现了大部分常用的HTML5的表单控件的类型(text, number, url, email, date, radio, checkbox),也实现了很多指令做为验证(required, pattern, minlength, maxlength, min, max)。

在自定义的指令中,我们可以添加我们的验证方法到ngModelController的$validators对象上。为了取得这个controller对象,我们需要requirengModel指令。

在$validators对象上的每个方法都接收modelValue和viewValue两个值做为参数。在你绑定的验证方法返回一个值(true,false)之后,Angular会在内部调用$setValidity方法。验证会在每一次输入框的值改变($setViewValue被调用)或者模型的值改变。验证发生在$parsers和$formatters成功运行之后,验证不通过的项会做为ngModelController.$error的属性存储起来。

另外,在这个controller对象上,还有一个$asyncValidators对象,如果你的验证是异步的,则需要加验证附加在这个对象上,比如说用户注册时输入手机号,我们需要在后端验证该手机号是否已经注册,这个验证方法必须return一个promise对象,然后在验证通过时调用延迟对象的resolve,失败时调用reject,还未完成的异步的验证存储在ngModelController.$pending中。

例如(注意其中的user对象,只有验证通过了,才会将值绑定到模型上):

<form name="register_form" ng-submit="save()">
    <div class="form-group">
        <label for="phoneNumber">
            手机号(不能重复):
        </label>
        <input type="text" class="form-control" ng-model="user.phoneNumber" id="phoneNumber" name="phoneNumber" required phone>
    </div>
    <div class="form-group">
        <label for="username">
            用户名(必须大于五位):
        </label>
        <input type="text" class="form-control" ng-model="user.username" id="username" required username>
    </div>
    <button class="btn btn-block btn-primary" type="submit">提交</button>
</form>
<h3>用户对象</h3>
<pre>
    {{ user | json }}
</pre>
'use strict';
angular.module('app', [])
.directive('phone', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$asyncValidators.phone = function (modelValue, viewValue) {
        var d = $q.defer();
        $http.get('phone.json')
        .success(function (phoneList) {
          if (phoneList.indexOf(parseInt(modelValue)) >= 0) {
            d.reject();
          } else {
            d.resolve();
          }
        });
        return d.promise;
      }
    }
  }
})
.directive('username', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$validators.username = function (modelValue, viewValue) {
        if (modelValue) {
          return modelValue.length > 5 ? true : false;
        };
        return false;
      }
    }
  }
})

phone.json

[
  13758262732,
  15658898520,
  13628389818,
  18976176895,
  13518077986
]

效果

AngularJS自定义表单验证功能实例详解

下面一个完整的用户注册的表单验证:

html:

<form name="register_form" novalidate>
    <div class="form-group">
        <label for="username">用户名:</label>
        <!-- ng-pattern="/PATTERN/"确保输入项符合正则 -->
        <input type="text" id="username" ng-model="user.username" class="form-control" name="username" required ng-pattern="/^[^#]*$/">
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.username.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.username.$error.pattern">
        <strong>请注意!</strong>
        用户名不能带#号。
    </div>
    <div class="alert alert-danger" ng-show="register_form.username.$error.required && register_form.username.$touched">
        <strong>请注意!</strong>
        用户名不能为空。
    </div>
    <div class="form-group">
        <label for="_password">密码:</label>
        <!-- ng-minlength="num"让密码不能小于最小长度 -->
        <input type="password" id="_password" ng-model="data._password" class="form-control" required ng-minlength="8" name="_password">
        <span class="glyphicon glyphicon-ok right" ng-show="register_form._password.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form._password.$error.minlength && register_form._password.$touched">
        <strong>请注意!</strong>
        密码长度不能少于八位。
    </div>
    <div class="alert alert-danger" ng-show="register_form._password.$error.required && register_form._password.$touched">
        <strong>请注意!</strong>
        密码不能为空。
    </div>
    <div class="form-group">
        <label for="password">确认密码:</label>
        <input type="password" id="password" ng-model="user.password" class="form-control" name="password" required pwd-repeat>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.password.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.password.$error.pwdRepeat && register_form.password.$touched">
        <strong>请注意!</strong>
        两次输入的密码不相同。
    </div>
    <div class="alert alert-danger" ng-show="register_form.password.$error.required && register_form.password.$touched">
        <strong>请注意!</strong>
        请再次输入密码。
    </div>
    <div class="form-group">
        <label for="phone">手机号:</label>
        <div class="row">
            <div class="col-sm-10">
                <input type="num" id="phone" ng-model="user.phone" name="phone" class="form-control" required ng-minlength="11" ng-maxlength="11" phone>
            </div>
            <div class="col-sm-2">
                <button class="btn btn-default" type="button" ng-disabled="register_form.phone.$invalid">发送验证码</button>
            </div>
        </div>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.phone.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.phone.$error.phone">
        <strong>请注意!</strong>
        该手机号已注册过,可直接登录。
    </div>
    <div class="alert alert-danger" ng-show="register_form.phone.$touched && !register_form.phone.$error.phone && (register_form.phone.$error.required || register_form.phone.$error.minlength || register_form.phone.$error.maxlength)">
        <strong>请注意!</strong>
        请输入正确的手机号。
    </div>
    <div class="form-group">
        <label for="code">验证码:</label>
        <input type="text" id="code" ng-model="user.code" class="form-control" name="code" required>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.code.$valid"></span>
    </div>
    <!-- 在表单不合法时禁用提交按钮 -->
    <button class="btn btn-block btn-primary" type="submit" ng-disabled="register_form.$invalid" ng-click="save()">提交</button>
</form>

js:

'use strict';
angular.module('app', [])
.controller('myCtrl', function ($scope) {
  $scope.data = {};
  $scope.save = function () {
    alert('保存成功!')
  }
})
// 判断手机号是否重复
.directive('phone', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$asyncValidators.phone = function (modelValue, viewValue) {
        var d = $q.defer();
        $http.get('phone.json')
        .success(function (phoneList) {
          if (phoneList.indexOf(parseInt(modelValue)) >= 0) {
            d.reject();
          } else {
            d.resolve();
          }
        });
        return d.promise;
      }
    }
  }
})
// 验证两次输入的密码是否相同的自定义验证
.directive('pwdRepeat', function () {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$validators.pwdRepeat = function (modelValue) {
        // 当值为空时,通过验证,因为有required
        if (ctrl.$isEmpty(modelValue)) {
          return true;
        }
        return modelValue === scope.data._password ? true : false;
      }
    }
  }
})

css:

.form-group {
  position: relative;
}
.right {
  position: absolute;
  right: 10px;
  top: 34px;
  color: green;
}

phone.json:

[
  13758262732,
  15658898520,
  13628389818,
  18976176895,
  13518077986
]

AngularJS自定义表单验证功能实例详解

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
Tab切换组件(选项卡功能)实例代码
Nov 21 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
JavaScript判断前缀、后缀是否是空格的方法
Apr 15 Javascript
提高jQuery性能优化的技巧
Aug 03 Javascript
js检测用户输入密码强度
Oct 22 Javascript
基于JavaScript实现div层跟随滚动条滑动
Jan 12 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
vuex的简单使用教程
Feb 02 Javascript
VUE项目初建和常见问题总结
Sep 12 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
JS快速实现简单计算器
Apr 08 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 #Javascript
element-ui 关于获取select 的label值方法
Aug 24 #Javascript
微信小程序用户信息encryptedData详解
Aug 24 #Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 #Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 #Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 #Javascript
element-ui 表格数据时间格式化的方法
Aug 24 #Javascript
You might like
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
javascript常用对话框小集
2013/09/13 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
EJB的基本架构
2016/09/22 面试题
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
英语专业毕业生自荐信
2013/10/28 职场文书
幼儿园老师寄语
2014/04/03 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
中秋晚会活动方案
2014/08/31 职场文书
实习证明格式范文
2014/10/14 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
英雄儿女观后感
2015/06/09 职场文书
SQL Server删除表中的重复数据
2022/05/25 SQL Server