angular 中表单验证的探索
需求
之前有一段时间做一个搜索查询
但是有很多限制条件,如果校验不成功需要给用户提示错误,当然项目用的是组件库的校验
我能否自己写一个?
其实 我是不会的!!!

探索
angular 的校验功能很强大
自身校验
<form name="$ctrl.myForm">
<div class="field">
<input type="email"
name="myEmail"
minlength="5"
maxlength="100"
ng-model="$ctrl.myEmail"
required />
<div ng-if="$ctrl.myForm.myEmail.$invalid">There is an error with the field...</div>
</div>
</form>
- $pristine (未修改过验证true)
- $dirty (修改过为true)
- $valid (通过验证)
- $invalid (未经过验证)
我们可以创建自定义的ngModel在ngModelController中实现验证。
angular中通过$validators来实现验证
var m1 = angular.module('app', []);
m1.controller('customValidator', function () {
require: 'ngModel',
link: function () { scope, element, attrs, ngModel} {
ngModel.$validators.myValidator = function () {
......
}
}
})
自定义校验
在angularJs中使用$validators来实现表单的验证
m1.directive('validatePasswordCharacters', function() {
var REQUIRED_PATTERNS = [
/\d+/,
/[a-z]+/,
/[A-Z]+/,
/\W+/,
/^\S+$/
];
return {
require : 'ngModel',
link : function($scope, element, attrs, ngModel) {
ngModel.$validators.passwordCharacters = function(value) {
var status = true;
angular.forEach(REQUIRED_PATTERNS, function(pattern) {
status = status && pattern.test(value);
});
return status;
};
}
}
});
<form name="myForm">
<div class="label">
<input name="myPassword" type="password" ng-model="data.password" validate-password-characters required />
<div ng-if="myForm.myPassword.$error.required && myForm.myPassword.$dirty">
You did not enter a password
</div>
<div ng-if="myForm.myPassword.$error.passwordCharacters && myForm.myPassword.$dirty">
Your password must contain a numeric, uppercase and lowercase as well as special characters
</div>
</div>
</form>
结果
没有输入之前

随意输入

异步校验
通过异步ajax与后台胡来判断用户的输入
ngModule.directive('usernameAvailableValidator', ['$http', function($http) {
return {
require : 'ngModel',
link : function($scope, element, attrs, ngModel) {
ngModel.$asyncValidators.usernameAvailable = function(username) {
return $http.get('/api/username-exists?u='+ username);
};
}
}
}]);
异步校验器$asyncValidators在触发的时候需要每个验证器返回一个promise对象。当promise完成的时候便是通过,reject的时候把错误注册到$error对象上。
当所有验证器通过,值才写入scope.
异步验证期间$valid和$invalide为undefined, 会有一个特殊标志$pending来表示,异步验证完成被移除。
<form name="myForm">
<input type="text"
class="input"
name="username"
minlength="4"
maxlength="15"
ng-model="form.data.username"
pattern="^[-\w]+$"
username-available-validator
placeholder="Choose a username for yourself"
required />
<div ng-if="myForm.username.$pending">
Checking Username...
</div>
<!-- ... -->
</form>
使用ngMessage来显示错误
<form name="myForm">
<input type="text" name="colorCode" ng-model="data.colorCode" minlength="6" required>
<div ng-message="myForm.colorCode.$error" ng-if="myForm.$submitted || myForm.colorCode.$touched">
<div ng-message="required">22.</div>
<div ng-message="minlength">333...</div>
<div ng-message="pattern">444...</div>
</div>
<nav class="actions">
<input type="submit" />
</nav>
</form>
<script type="text/javascript">
var ngModule = angular.module('myApp', ['ngMessages']);
</script>
当然 如果ng-message 无法满足错误提示的需求 也可以用ng-message-include
<div ng-message-include='toolTpl'></div>
以上!!!
最后我的愿望

angular 中表单验证的探索的更多相关文章
- HTML5中表单验证的8种方法(转)
在深人探讨表单验证之前,让我们先思考一下表单验证的真实含义.就其核心而言,表单验证是一套系统,它为终端用户检测无效的控件数据并标记这些错误.换言之,表单验证就是在表单提交服务器前对其进行一系列的检查并 ...
- HTML5中表单验证的8种方法
HTML5中表单验证的8种方法 2012-4-21 11:00| 发布者: benben| 查看: 2765| 评论: 0 摘要: 前一篇,我们介绍了HTML5中新的表单特性和函数, 今天就继续来谈谈 ...
- Angular 表单验证类库 ngx-validator 1.0 正式发布
背景介绍 之前写了一篇 <如何优雅的使用 Angular 表单验证>,结尾处介绍了统一验证反馈的类库 ngx-validator ,由于这段时间一直在新模块做微前端以及相关业务组件库, ...
- Angular表单验证
novalidate 去掉html5自带的验证 ng-minlength 规定输入文本的最小长度 ng-maxlength 规定输入文本的最大长度 ng-submit 接收一个方法名 ...
- 简单的angular表单验证指令
<html ng-app="myApp"> <head> <meta charset="UTF-8"> <title& ...
- angular表单验证实例----可用的代码
前段时间,公司做一个单页面,就是一个表单验证,早开始在菜鸟教程上关注了angular,所以下派上用场了 angular里面对于表单验证,设置了很多指令. 也就是说不用自己写一些逻辑,直接绑定指令就行. ...
- 从浅入深剖析angular表单验证
最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. 入门之前,我觉得应该先了 ...
- angular 表单验证
最近在用angular写表单验证时 , 不小心把ng-model全替换删掉了, 然后发现之前写的验证都失效, 在查阅资料和反复修改摸索后, 发现angular中的表单验证, 都是基于ng-model的 ...
- 如何优雅的使用 Angular 表单验证
随便说说,这一节可以跳过 去年参加 ngChine 2018 杭州开发者大会的时候记得有人问我: Worktile 是什么时候开始使用 Angular 的,我说是今年(2018年) 3 月份开始在新模 ...
随机推荐
- 解决jquery与zepto等其它库冲突兼容的问题
解决jquery与zepto等其它库冲突兼容的问题;(function ($) { }) (jQuery); ;(function ($) { }) (Zepto); 在Bootstrap ...
- GitHub上README写法暨markdown语法解读
原文: GitHub上README写法暨markdown语法解读 自从开始玩GitHub以来,就 越来越 感觉它有爱.最近对它的 README.md 文件颇为感兴趣.便写下这贴,帮助更多的还不会编写R ...
- 自己写的enum转换的一个扩展,
public static String ToEnumName(this int? source, Type e) { if (!source.HasValue) throw new Argument ...
- C# datatable to list
C# DataTable 和List之间相互转换的方法 好库文章 » 软件开发 » .NET » C# 发布者:好饱 发布日期:2013-1-27 22:17:49 更新日期:2013-1-27 ...
- vue elementui 递归 sidebar可伸缩侧边栏
最近在学习vue 做了一个可伸缩的 侧边栏 记录下 在很多管理系统都用到 管理系统一般都长的差不多 首先是收起时候 展开时候 首先是新建一个Layout.vue <template> &l ...
- 转 C++中的static关键字
C++中的static关键字 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作 ...
- glRotatef 转动方向
http://blog.sina.com.cn/s/blog_3c6889fe0100qko6.html glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLf ...
- LPTSTR\LPCTSTR\LPWSTR\LPCWSTR 字母的意思 及 区别
标签: 杂谈 分类: VC char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容. LP的含义 ...
- picker(拖拽上下拉动的选项)
[b]新版本更新:鼠标上下拖动选择内容:http://hiuman.iteye.com/blog/2353563[/b] (如有错敬请指点,以下是我工作中遇到并且解决的问题) 一开始搜这个内容的时候, ...
- Apache开启PHP的伪静态模式
首先,什么是伪静态: 伪静态又名URL重写,是动态的网址看起来像静态的网址.换句话说就是,动态网页通过重写 URL 方法实现去掉动态网页的参数,但在实际的网页目录中并没有必要实现存在重写的页面. 1. ...