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 月份开始在新模 ...
随机推荐
- BZOJ1179_APIO2009_抢掠计划_C++
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1179 一道用 Tarjan 缩点+SPFA 最长路的题(Tarjan 算法:http://ww ...
- 使用 padding-bottom 设置高度基于宽度的自适应
我们在做移动端列表,通常会做到图文列表,列表是自适应的.当列表中有图片,图片的宽度是随着列表宽的变化而变化,我们为了在图片宽度变化的时候做到图片的不变形,所有采用以下办法. 本文章只讲语法 html ...
- zmap zgrab 环境搭建
yum install cmake gmp-devel gengetopt libpcap-devel flex byacc json-c-devel libunistring-devel golan ...
- 【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)
原文转自 http://blog.csdn.net/qq_23536063/article/details/52291332 [问题描述] CString cstr: sring str(cstr.G ...
- nginx 根据POST GET方法跳转
location ~ /server/ { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_r ...
- 如何让natTable表格支持自定义多个右键菜单
在nebula中,官方默认提供了一个构造natTable的builder类,并且提供了一个debugInfo的默认右键菜单,但是当我们通过官方提供的builder去创建natTable,并且要添加多个 ...
- 使用bottle进行web开发(3):静态文件的获取
静态文件(比如css啊,需要下载的各位文件等),需要通过static_file来操作,首先记得要在import中导入 @route('/static/<filename>') def se ...
- UbuntuMate开机自动启动ssh服务
在文件/etc/init/ssh.conf中,有一句 start on filesystem or runlevel [2345] 如果想关闭自动启动的话,把这一局修改为start on runlev ...
- Codeforces 798 B. Mike and strings-String的find()函数
好久好久好久之前的一个题,今天翻cf,发现这个题没过,补一下. B. Mike and strings time limit per test 2 seconds memory limit per t ...
- System.getProperty("os.name")
Here is a handy Java class that useSystem.getProperty("os.name") to detect which type of o ...