驗證功能是AngularJS里面最酷炫的功能之一,它可以讓你寫出一個具有良好用戶體驗的Web應用。
在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自帶的屬性驗證功能。
Tips:通常需要在form標簽中加上novalidate
屬性,這樣可以禁用瀏覽器自帶的驗證功能,從而使用AngularJS提供的。
下面來看看我們可以在input中設置哪些驗證:
必填
驗證是否已輸入文字,只需在標簽上加上required:
<input type="text" required />
最小長度
驗證至少輸入{number}個字符,使用指令ng-minlength=“{number}”:
<input type="text" ng-minlength=5 />
最大長度
驗證至多輸入{number}個字符,使用指令ng-maxlength=“{number}”:
<input type="text" ng-maxlength=20 />
正則匹配
確保輸入匹配一個正則表達式,使用指令ng-pattern="/PATTERN/"
:
<input type="text" ng-pattern="/a-zA-Z/" />
驗證輸入是一個Email,設置input的type屬性為email:
<input type="email" name="email" ng-model="user.email" />
數字
驗證輸入是一個數字,設置input的type屬性為number:
<input type="number" name="number" 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,表示沒有修改過:
formName.inputFieldName.$pristine;
修改的表單
當且用戶是否已經修改過表單:
formName.inputFieldName.$dirty
經過驗證的表單
表示否通過驗證:
formName.inputFieldName.$valid
未通過驗證的表單
表示否通過驗證。如果表單當前沒有通過驗證,他將為true:
formName.inputFieldName.$invalid
最后兩個屬性在用於DOM元素的顯示或隱藏時是特別有用的。當然,如果想要設置特定的class時,他們也是非常有用的。
錯誤
另一個有用的屬性是AngularJS提供的$error對象。這個對象包含每一個無效的input驗證的集合。為了訪問這個屬性,使用下面的語法:
formName.inputfieldName.$error
如果驗證失敗,則此屬性將是true的(因為length>0)。
控制驗證時的樣式
當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; }
全部放一起試試
讓我們編寫一個注冊表單。本申請表單將包括姓名,Email,以及用戶名。
讓我們定義一個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> <label>Your name</label> <input type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required /> </div> </div>
我們增加了一個名字為name的輸入框,並且將對象綁定在$scope對象的signup.name對象上(通過ng-model)。
我們還設置了幾個驗證。這些驗證分別是:必須有一個長度為3或更多的名字。並且最大長度限制為20個字符。最后,名稱應該是必填的。
讓我們用屬性來控制顯示還是隱藏錯誤信息。我們還將使用$dirty屬性,以確保當用戶沒有輸入字符前錯誤信息不會顯示:
<div class="row"> <div> <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>
讓我們接着看Email驗證:
<div class="row"> <div> <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>