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; } } }
})
[ 13758262732, 15658898520, 13628389818, 18976176895, 13518077986
]
效果:
下面一个完整的用户注册的表单验证:
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>
'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; } } }
})
form-group { position: relative;
}
.right { position: absolute; right: 10px; top: 34px; color: green';
}
AngularJS自定义表单验证相关推荐
- angularjs的表单验证
angularjs的表单验证 废话:angular的热度在减小,但是老项目依旧是angular的,就是不能丢,得会 干活直接上代码 <!DOCTYPE html> <html> ...
- Django 表单验证之自定义表单验证器
本文基于Django 表单验证 一文,补充完善表单验证器之自定义表单验证器 具体步骤总结如下: 第一:在formValidation.py 文件中,添加自定义名称敏感验证器(NameValidatio ...
- 表单验证与自定义表单验证
/ 验证规则 rules: { // 多个验证用数组 单个验证用对象// 验证账号acc: [{ required: true, message: '不能为空', trigger: 'blur' }, ...
- 记录element-ui自定义表单验证上传身份证正反面
大概是这个样式 两个上传组件写在一个form-item里进行自定义表单验证 每次验证,通过判断上传组件绑定的值进行判断,callback不同的提示错误 <template><div& ...
- iview自定义表单验证
@[TOC] iview自定义表单验证 之前总结过iview简单表单验证: https://blog.csdn.net/A_LL_IS_WELL/article/details/111227468ht ...
- vue + element 自定义表单验证的时候 需要通过请求后端接口验证
vue + element 自定义表单验证的时候 需要通过请求后端接口验证 做vue项目的时候遇到了一个需求,在验证某个表单项时不仅需要是必填项而且要去通过接口校验是否有重复值. // templat ...
- antd vue表单验证_antd-for-vue 表单验证失效 自定义表单验证使表单非空验证失效(其他验证失效)...
## antd-for-vue 表单验证失效 自定义表单验证使表单非空验证失效(其他验证失效) ##### antd 的 表单校验方法包括 validateFields 和 validateField ...
- ant-design-vue 表单验证和 validator 自定义表单验证
在 ant-design-vue 中,提供 FormModel 表单组件,且支持 v-model 数据绑定,同时可以校验和提交功能的表单. 一.表单验证 <a-form-modelref=&qu ...
- vux使用方法 php,如何使用vux-ui自定义表单验证
这次给大家带来如何使用vux-ui自定义表单验证,使用vux-ui自定义表单验证的注意事项有哪些,下面就是实战案例,一起来看一下. 初学框架vue搭配vux使用发现这个UI库使用有些力不从心.下面说说 ...
最新文章
- Matplotlib绘图双纵坐标轴设置及控制设置时间格式
- 腾讯SNG的实习offer(多篇面经分享)
- linux系统中 库分为静态库和,你知道linux 静态库和共享库?
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)...
- 程序设计课程技巧小总结
- Linux服务器非root用户下安装CUDA11.1和cudnn到指定目录
- MySQL Data Manipulation Statements
- java 类型转换方法_Java中的实用类型转换的方法
- 前端知识天天学(2)
- linux火狐浏览器和爬虫,爬虫入门:Firefox 结合 Scrapy Shell 爬取网页数据
- Ubuntu10.04使用HP LaserJetPro P1606dn
- DevOps和SRE
- 利用Java计算圆柱体积
- oracle用户授权只读,只读权限oracle用户
- 7月算法训练------第十四天(栈)解题报告
- 公司宣传片拍摄文案怎么写?
- git配置忽略某个文件提交
- 肠道菌群与睡眠的双向桥接
- STM8S---IO复用配置(STVP方式)
- 1023: 大小写转换 ZZULIOJ