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 表单取值赋值的一些基本操作
Oct 11 Javascript
jquery中EasyUI实现异步树
Mar 01 Javascript
js实现文本框输入文字个数限制代码
Dec 25 Javascript
基于js中的原型、继承的一些想法
Aug 10 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 Javascript
JS+CSS实现随机点名(实例代码)
Nov 04 Javascript
vue移动端使用canvas签名的实现
Jan 15 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
如何使用vue3打造一个物料库
May 08 Vue.js
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 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的FTP学习(三)
2006/10/09 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php封装的page分页类完整实例
2016/10/18 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
利用python实现冒泡排序算法实例代码
2019/12/01 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
会计专业毕业生求职信分享
2014/01/03 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
心理健康日活动总结
2014/05/08 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
委托书范本格式
2019/04/18 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js