ng-validate
客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。
在AngularJS中,有许多表单验证指令。在这里,我们将谈谈几个最流行指令,然后我们将讨论如何编写自定义的验证。
<form name="form">
<label name="email">Your email</label>
<input type="email" name="email" ng-model="email" placeholder="Email Address" />
</form>
AngularJS使得我们可以在不用额外努力的情况下轻松的处理客户端表单验证。虽然我们不能仅靠客户端验证来保持我们的Web应用程序的安全性,但他们提供了良好即时反馈到表单上。
要使用表单验证,我们首先必须确保 form 标签有一个 name 属性,像上面的例子一样。明白了吗?太好了!
所有输入字段可以进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。
通常需要在 form 标签中加上 novalidate
属性, 这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。
让我们来看看我们可以在input设置哪些验证:
必填
验证是否已输入字符,只需在标签上加上 required :
<input type="text" required />
最小长度
验证输入至少输入{number}个字符,使用AngularJS指令的 ng-minlength=“{number}” :
<input type="text" ng-minlength=5 />
最大长度
验证输入字符要小于等于{number}个字符,使用AngularJS指令的 ng-maxlength=“{number}” :
<input type="text" ng-maxlength=20 />
正则匹配
要确保输入匹配一个正则表达式,使用AngularJS的指令 ng-pattern="/PATTERN/"
:
<input type="text" ng-pattern="/a-zA-Z/" />
验证输入字符是一个电子邮件地址,只需设定 input 的 type 属性为 email ,像这样:
<input type="email" name="email" ng-model="user.email" />
数字
验证输入字符是一个数字,同样只需设定 input 的 type 属性为 number ,像这样:
<input type="number" name="email" ng-model="user.age" />
Url
验证输入字符是一个URL地址,同样只需设定 input 的 type 属性为 url ,像这样:
<input type="url" name="homepage" ng-model="user.facebook_url" />
自定义验证
AngularJS可以很容易的使用指令来添加自定义验证。例如,我们要验证我们的用户名是可用的(在数据库中不重复)。要做到这一点,我们将实现一个指令,它在输入字符变化时触发一个Ajax请求:
var app = angular.module('validationExample', []); app.directive('ensureUnique', ['$http', function($http) {
return {
require: 'ngModel',
link: function(scope, ele, attrs, c) {
scope.$watch(attrs.ngModel, function() {
$http({
method: 'POST',
url: '/api/check/' + attrs.ensureUnique,
data: {'field': attrs.ensureUnique}
}).success(function(data, status, headers, cfg) {
c.$setValidity('unique', data.isUnique);
}).error(function(data, status, headers, cfg) {
c.$setValidity('unique', false);
});
});
}
}
}]);
验证表单状态
AngularJS将DOM验证的结果保存在$scope对象中。这使我们能够实时做出一些响应。提供给我们的属性有:
请注意,这是这个属性的格式:
formName.inputFieldName.property
未修改过的表单
布尔值属性,表示用户是否修改了表单。如果为 ture ,表示没有修改过; false 表示修改过:
formName.inputFieldName.$pristine;
修改的表单
布尔型属性,当且仅当用户实际已经修改的表单。不管表单是否通过验证:
formName.inputFieldName.$dirty
经过验证的表单
布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为 true :
formName.inputFieldName.$valid
未通过验证的表单
布尔型属性,它指示表单是否通过验证。如果表单当前没有通过验证,他将为 true:
formName.inputFieldName.$invalid
最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,如果要设置特定的class时,他们也非常有用的。
错误
另一个有用的属性是AngularJS提供给我们的$error对象。这个对象包含 input 的每一个验证是有效的还是无效的(一个集合)。为了访问这个属性,使用下面的语法:
formName.inputfieldName.$error
如果验证失败,则此属性将是true的,而如果它是false的,那么该值通过验证的。
无害的一些样式
当AngularJS处理的表单验证时,它将根据验证的状态增加一些特定的class属性。这些class被命名为类似的属性,我们可以检查。
.ng-pristine {}
.ng-dirty {}
.ng-valid {}
.ng-invalid {}
这些class对应着其对应的验证对象的结果。
当一个字段是无效的, .ng-invalid
将被应用到这个字段上。我们可以通过css来设置这些class的样式:
input.ng-invalid {
border: 1px solid red;
}
input.ng-valid {
border: 1px solid green;
}
全部放在一起
让我们编写一个注册表单。本申请表单将包括这个人的名字,他们的电子邮件,以及所需的用户名。
让我们定义一个 form 表单:
<form name="signup_form" novalidate ng-submit="signupForm()">
<fieldset>
<legend>Signup</legend> <button type="submit" class="button radius">Submit</button>
</fieldset>
</form>
这个表单的名字是 signup_form
,当我们点击提交时我们将调用 signupForm()方法
.
现在,让我们添加用户的 Name 属性:
<div class="row">
<div class="large-12 columns">
<label>Your name</label>
<input type="text"
placeholder="Name"
name="name"
ng-model="signup.name"
ng-minlength=3
ng-maxlength=20 required />
</div>
</div>
首先我想说明我使用了 Foundation 作为我的css框架,所以你将在代码中看到它的相关语法。 我们增加了一个名字为name的输入框,并且对象绑定在 $scope 对象的signup.name 对象上(通过ng-model)。
我们还设置了几个验证。这些验证分别是:我们必须有一个长度为3个或更多字符的名字。并且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,我们设置名称应该是必填的。
当如果表单无效时,让我们用属性来控制显示还是隐藏错误列表。我们还将使用$dirty 属性,以确保当用户没有输入字符前错误提示不显示:
<div class="row">
<div class="large-12 columns">
<label>Your name</label>
<input type="text"
placeholder="Name"
name="name"
ng-model="signup.name"
ng-minlength=3
ng-maxlength=20 required />
<div class="error"
ng-show="signup_form.name.$dirty && signup_form.name.$invalid">
<small class="error"
ng-show="signup_form.name.$error.required">
Your name is required.
</small>
<small class="error"
ng-show="signup_form.name.$error.minlength">
Your name is required to be at least 3 characters
</small>
<small class="error"
ng-show="signup_form.name.$error.maxlength">
Your name cannot be longer than 20 characters
</small>
</div>
</div>
</div>
在之前,当输入内容改变时它只能告诉我们我们输入是否有效。这一次,我们将看到当那些没有通过的验证时的错误信息。
让我们来看看接下来的验证,一个电子邮件:
<div class="row">
<div class="large-12 columns">
<label>Your email</label>
<input type="email"
placeholder="Email"
name="email"
ng-model="signup.email"
ng-minlength=3 ng-maxlength=20 required />
<div class="error"
ng-show="signup_form.email.$dirty && signup_form.email.$invalid">
<small class="error"
ng-show="signup_form.email.$error.required">
Your email is required.
</small>
<small class="error"
ng-show="signup_form.email.$error.minlength">
Your email is required to be at least 3 characters
</small>
<small class="error"
ng-show="signup_form.email.$error.email">
That is not a valid email. Please input a valid email.
</small>
<small class="error"
ng-show="signup_form.email.$error.maxlength">
Your email cannot be longer than 20 characters
</small>
</div>
</div>
</div>
这一次(包括整个表单),我们编写电子邮件字段。请注意,我们设置了input的type属性为email并且添加了 $error.email 错误信息。这是基于AngularJS的电子邮件验证(使用HTML5的属性)。
最后,让我们来看看在我们的最后一个输入框,用户名:
<div class="large-12 columns">
<label>Username</label>
<input type="text"
placeholder="Desired username"
name="username"
ng-model="signup.username"
ng-minlength=3
ng-maxlength=20
ensure-unique="username" required />
<div class="error" ng-show="signup_form.username.$dirty && signup_form.username.$invalid">
<small class="error" ng-show="signup_form.username.$error.required">Please input a username</small>
<small class="error" ng-show="signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small>
<small class="error" ng-show="signup_form.username.$error.maxlength">Your username cannot be longer than 20 characters</small>
<small class="error" ng-show="signup_form.username.$error.unique">That username is taken, please try another</small>
</div>
</div>
在我们的最后一个字段,我们使用我们之前编写的自定义验证。这个自定义验证使用的AngularJS指令:
app.directive('ensureUnique', ['$http', function($http) {
return {
require: 'ngModel',
link: function(scope, ele, attrs, c) {
scope.$watch(attrs.ngModel, function() {
$http({
method: 'POST',
url: '/api/check/' + attrs.ensureUnique,
data: {'field': attrs.ensureUnique}
}).success(function(data, status, headers, cfg) {
c.$setValidity('unique', data.isUnique);
}).error(function(data, status, headers, cfg) {
c.$setValidity('unique', false);
});
});
}
}
}]);
当表单输入是有效的时,它将发送POST api/check/username请求到服务器来检查用户名是否可用。现在,很明显,因为我们在这里只谈论前端代码,我们没有为后端编写测试,尽管很容易。
更新: 根据评论的意见,我已经加入了服务器超时检查。要查看完整的源代码,请点击 here 。
最后,我们加上提交按钮,我们可以使用ng-disabled指令来根据验证是否有效控制按钮的禁用和启用:
<button type="submit" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>
正如我们上面所说的,表单是否有效的属性 $invalid 给我们提供了便利。
更新 2: 虽然立即验证是很棒的,它可以立即提醒用户,但是当他们正在输入很长的能通过验证的文字时,他们讲在输入中途看到错误提示。你可以更好的来处理这一点。当用户点击提交时,或者当他们将光标移开输入框之后。让我们来看看这2种方式。
点击提交后显示验证信息
要在用户试图提交表单时显示的验证,你可以通过在scope中设置一个'submitted'值,并检查该值来控制显示错误。
例如,让我们来看看第一个例子,只有在点击提交表单时才显示错误。使用 ng-show 指令来控制显示,我们可以添加一个检查,看是否已点击提交按钮:
<form name="signup_form" novalidate ng-submit="signupForm()">
<fieldset>
<legend>Signup</legend>
<div class="row">
<div class="large-12 columns">
<label>Your name</label>
<input type="text"
placeholder="Name"
name="name"
ng-model="signup.name"
ng-minlength=3
ng-maxlength=20 required />
<div class="error"
ng-show="signup_form.name.$dirty && signup_form.name.$invalid && signup_form.submitted">
<small class="error"
ng-show="signup_form.name.$error.required">
Your name is required.
</small>
<small class="error"
ng-show="signup_form.name.$error.minlength">
Your name is required to be at least 3 characters
</small>
<small class="error"
ng-show="signup_form.name.$error.maxlength">
Your name cannot be longer than 20 characters
</small>
</div>
</div>
</div>
<button type="submit" class="button radius">Submit</button>
</fieldset>
</form>
现在,那个错误信息的div只将在 signup_form.submitted 为 true 时 显示。我们可以这样实现这个 signupForm 方法:
app.controller('signupController', ['$scope', function($scope) {
$scope.submitted = false;
$scope.signupForm = function() {
if ($scope.signup_form.$valid) {
// Submit as normal
} else {
$scope.signup_form.submitted = true;
}
}
}]);
现在,当用户尝试提交表单并且同时有一个无效的元素时,你可以捕获它,并告诉他们错误的原因。
当时去焦点时验证错误
如果你想保留错误验证的实时性,那么可以在用户离开该输入框时显示错误信息。要做到这一点,我们可以添加一个指令,将添加一个新的变量。
我们使用 ngFocus 指令,它看起来像:
app.directive('ngFocus', [function() {
var FOCUS_CLASS = "ng-focused";
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
ctrl.$focused = false;
element.bind('focus', function(evt) {
element.addClass(FOCUS_CLASS);
scope.$apply(function() {ctrl.$focused = true;});
}).bind('blur', function(evt) {
element.removeClass(FOCUS_CLASS);
scope.$apply(function() {ctrl.$focused = false;});
});
}
}
}]);
要使用 ngFocus ,我们只需要简单加上这个指令到输入框元素上,像这样:
<input ng-class="{error: signup_form.name.$dirty && signup_form.name.$invalid}" type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required ng-focus />
加上 ngFocus 指令后,将在输入框的blur和focus事件中注册相应操作,当焦点在该输入框时,它添加一个class(ng-focused),并且该输入框的$focused属性也将变为true。因此,你可以根据需求是否在焦点上来个性化设置显示错误消息。例如:
<div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">
我希望这篇文章可以告诉你如何的很酷的使用AngularJS来进行表单验证
ng-validate的更多相关文章
- struts2(三)---struts2中的服务端数据验证框架validate
struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个acti ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- jQuery Validate 表单验证 — 用户注册简单应用
相信很多coder在表单验证这块都是自己写验证规则的,今天我们用jQuery Validate这款前端验证利器来写一个简单的应用. 可以先把我写的这个小demo运行试下,先睹为快.猛戳链接--> ...
- 【码在江湖】前端少侠的json故事(中)ng的json
ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...
- jquery validate表单验证插件-推荐
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
- jq.validate隐藏元素忽略验证
jq.validate隐藏元素忽略验证 现在有这样一个需求,当触发某类事件时候,需要在页面中显示input框,但是当不需要加载页面中的元素时候,进行隐藏.在这个需求的前提下,程序中对于input中的输 ...
- jq.validate 自定义验证两个日期
jq.validate 自定义验证两个日期 首先定义有一个表单,date1和date2是属于表单的元素,若date1大于date2,返回false:若date1<date2,返回true.使用j ...
- 修改 jquery.validate.js 支持非form标签
尝试使用markdown来写一篇blog,啦啦啦 源代码传送门:github 在特殊情况下我们使用jquery.validate.js对用户输入的内容做验证的时候,表单并不是一定包含在form之中,有 ...
- 表单验证插件之jquery.validate.js
提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...
- validate表单验证插件
1.引入validate.js包 <script src="xx/xx/jquery.validate.min.js"></script> 2.表单验证 / ...
随机推荐
- 二、Mp3帧分析(标签帧)
Mp3文件由帧组成,帧分成标签帧和数据帧,本文就Mp3文件的帧进行分析. 一.标签帧 MP3帧头中除了存储一些象private.copyright.original的简单音乐说明信息以外,没有考虑存放 ...
- LINQ 之四 (SkipWhile和TakeWhile)
看到书上的例子很正常,于是,我写了个不正常一点的. 书上的是这样的 class Program { static void Main(string[] args) { ,,,,,,,,}; ); fo ...
- 修改MySQL默认最大连接数
修改MySQL默认最大连接数 MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两个: 方法一: 进入MYSQL ...
- Bootstrap的datepicker控件
为input 控件的text 添加datepicker()方法后,原本的控件change事件无法正常触发.原因是项目中同时使用了用了jquery ui,碰巧它里面也有一个datepicker,名字一模 ...
- C语言中宏定义(#define)时do{}while(0)的价值(转)
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...
- node学习 process笔记
如果你是node大神好了可以关闭此页面了因为接下来游览会白白浪费你许多时间,最近一直学习node.js今晚看到 alsotang 在 github上的node教程 https://github.com ...
- 解决linux top命令提示的unknown terminal type的问题
[root@localhost bin]# top 'xterm-256color': unknown terminal type. 在网上搜索了解决方法如下: 解决办法: 1.临时办法,下次启动失效 ...
- 运行加速多线程和GPU
http://blog.csdn.net/augusdi/article/details/11883003
- js中邦定事件与解绑支持匿名函数
和一个朋友讨论了一下,DOM2绑定方式都是有名的函数,匿名的处理起来有些麻烦,而且即使是有名的函数,在IE低版本的浏览器也是解除不掉的,this指向需要修改,着实费了一番功夫,这个是兼容ie低版本的, ...
- java学习:AWT组件和事件处理的笔记(1)--文本框上的ActionEvent事件
学习处理事件时,必须很好的掌握事件源,监视器,处理事件的接口 1.事件源 能够产生java认可事件的对象都可称为事件源,也就是说事件源必须是对象 2.监视器 监 ...