客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可让你从一开始就写出一个具备交互性和可相应的现代HTML5表单。css
在AngularJS中,有许多表单验证指令。在这里,咱们将谈谈几个最流行指令,而后咱们将讨论如何编写自定义的验证。html
<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属性,像上面的例子同样。明白了吗?太好了!git
全部输入字段能够进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。github
一般须要在form标签中加上novalidate
属性,这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。正则表达式
让咱们来看看咱们能够在input设置哪些验证:数据库
验证是否已输入字符,只需在标签上加上required:后端
<input type="text" required />
验证输入至少输入{number}个字符,使用AngularJS指令的ng-minlength=“{number}”:api
<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地址,一样只需设定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被命名为相似的属性,咱们能够检查。
这些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>