表單驗證

若是想要屏蔽瀏覽器對錶單的默認驗證行爲,能夠在表單元素上添加novalidate標記。
下面看一下能夠在input元素上使用的全部驗證選項javascript

1. 必填項
驗證某個表單輸入是否已填寫,只要在輸入字段元素上添加HTML5標記required便可:
<input type="text" required />
2. 最小長度
驗證表單輸入的文本長度是否大於某個最小值,在輸入字段上使用AngularJS指令ng-minleng=
"{number}":
<input type="text" ng-minlength="5" />
3. 最大長度
驗證表單輸入的文本長度是否小於或等於某個最大值,在輸入字段上使用AngularJS指令
ng-maxlength="{number}":
<input type="text" ng-maxlength="20" />
4. 模式匹配
使用ng-pattern="/PATTERN/"來確保輸入可以匹配指定的正則表達式:
<input type="text" ng-pattern="[a-zA-Z]" />
5. 電子郵件
驗證輸入內容是不是電子郵件,只要像下面這樣將input的類型設置爲email便可:
<input type="email" name="email" ng-model="user.email" />
6. 數字
驗證輸入內容是不是數字,將input的類型設置爲number:html

<input type="number" name="age" ng-model="user.age" />
7. URL
驗證輸入內容是不是URL,將input的類型設置爲 url:
<input type="url" name="homepage" ng-model="user.facebook_url" />
8. 自定義驗證
在AngularJS中自定義指令是很是容易的。鑑於目前尚未介紹到指令的相關內容,第10章
再深刻研究如何建立自定義驗證。目前先來看一下如何經過向後端服務器發送請求,並經過響應
的結果來將輸入字段設置爲合法或不合法,以確保輸入字段中的內容是惟一的。
9. 在表單中控制變量
表單的屬性能夠在其所屬的$scope對象中訪問到,而咱們又能夠訪問$scope對象,所以
JavaScript能夠間接地訪問DOM中的表單屬性。藉助這些屬性,咱們能夠對錶單作出實時(和
AngularJS中其餘東西同樣)響應。這些屬性包括下面這些。
(注意,可使用下面的格式訪問這些屬性。)
formName.inputFieldName.propertyjava

 未修改的表單
這是一個布爾屬性,用來判斷用戶是否修改了表單。若是未修改,值爲true,若是修改過值
爲false:
formName.inputFieldName.$pristine
 修改過的表單
只要用戶修改過表單,不管輸入是否經過驗證,該值都返回true:
formName.inputFieldName.$dirty
 合法的表單
這個布爾型的屬性用來判斷表單的內容是否合法。若是當前表單內容是合法的,下面屬性的
值就是true:
formName.inputFieldName.$valid
 不合法的表單
這個布爾屬性用來判斷表單的內容是否不合法。若是當前表單內容是不合法的,下面屬性的
值爲true:
formName.inputFieldName.$invalid
 錯誤
這是AngularJS提供的另一個很是有用的屬性:$error對象。它包含當前表單的全部驗證
內容,以及它們是否合法的信息。用下面的語法訪問這個屬性:
formName.inputfieldName.$errorjquery

若是驗證失敗,這個屬性的值爲true;若是值爲false,說明輸入字段的值經過了驗證。
10. 一些有用的CSS樣式
AngularJS處理表單時,會根據表單當前的狀態添加一些CSS類(例如當前是合法的、未發生
變化的,等等),這些CSS類的命名和前面介紹的屬性很類似。
它們包括:
.ng-pristine {}
.ng-dirty {}
.ng-valid {}
.ng-invalid {}
它們對應着表單輸入字段的特定狀態。
當某個字段中的輸入非法時,.ng-invlid類會被添加到這個字段上。當前例子中的站點將
對應的CSS樣式設置爲:
input.ng-invalid {
border: 1px solid red;
}
input.ng-valid {
border: 1px solid green;
}正則表達式

表單實例html代碼以下bootstrap

 1 <!DOCTYPE html>
 2 <html ng-app = "myApp">
 3 <head>
 4     <title>Simple app</title>
 5 </head>
 6 <body>
 7     <form name = "signup_form" novalidate-submit = "signupForm()">
 8         <fieldset>
 9             <legend>Signup</legend>
10 
11             <div class = "row">
12                 <div class = "large-12 columns">
13                     <label>Your name</label>
14                     <input type = "text" placeholder="Name" name = "name" ng-model = "signup.name" ng-minlength = 3 ng-maxlength = 20 required />
15                     <!-- 對輸入進行實時驗證,若對輸入進行過更改且輸入不合格則實時進行錯誤顯示-->
16                     <div class = "error" ng-show = "signup_form.name.$dirty && signup_form.name.$invalid">
17                         <small class = "error" ng-show = "signup_form.name.$error.required">Your name is required.</small>
18                         <small class = "error" ng-show = "signup_form.name.$error.minlength">Your name is required to be at least 3 characters</small>
19                         <small class = "error" ng-show = "signup_form.name.$error.maxlength">Your name can't be longer than 20 characters</small>
20                     </div>
21                 </div>
22             </div>
23 
24             <div class = "row">
25                 <div class = "large-12 columns">
26                     <label>Your email</label>
27                     <input type="email" placeholder="Email" name = "email" ng-model = "signup.email" ng-minlength = 3 ng-maxlength = 20 required />
28                     <div class = "error" ng-show = "signup_form.email.$dirty && signup_form.email.$invalid">
29                         <small class = "error" ng-show = "signup_form.email.$error.required">Your email is required.</small>
30                         <small class = "error" ng-show = "signup_form.email.$error.minlength">Your email is required to be at least 3 characters</small>
31                         <small class = "error" ng-show = "signup_form.email.$error.email">That is not a valid email.Please input a valid email.</small>
32                         <small class = "error" ng-show = "signup_form.email.$error.maxlength">Your email can't be longer than 20 characters</small>
33                     </div>
34                 </div>
35             </div>
36 
37             <div class = "large-12 columns">
38                 <label>Username</label>
39                 <input type = "text" placeholder="Desired username" name = "username" ng-model = "signup.username" ng-minlength = 3 ng-maxlength = 20 ensure-unique = "username" required />
40                 <div class = "error" ng-show = "signup_form.name.$dirty && signup_form.name.$invalid">
41                         <small class = "error" ng-show = "signup_form.username.$error.required">Please input a username.</small>
42                         <small class = "error" ng-show = "signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small>
43                         <small class = "error" ng-show = "signup_form.username.$error.maxlength">Your username can't be longer than 20 characters</small>
44                         <small class = "error" ng-show = "signup_form.username.$error.unique">That username is taken, please try another</small>
45                     </div>
46             </div>
47 
48             <button type = "submit" class = "button radius" ng-disabled = "signup_form.$invalid">Submit</button>
49         </fieldset>
50     </form>
51 <script type="text/javascript" src = "js/jquery.min.js"></script>
52 <script type="text/javascript" src = "js/bootstrap.min.js"></script>
53 <script type="text/javascript" src = "js/angular.js"></script>
54 <script type="text/javascript" src = "js/app.js">
55 </script>
56 </body>
57 </html>
View Code

js代碼以下後端

 1 var myApp = angular.module('myApp', []);
 2 myApp.directive('ensureUnique', ['$http', function($http) {
 3     return {
 4         require: 'ngModel',
 5         link: function(scope, ele, attrs, c) {
 6             scope.$watch(attrs.ngModel, function() {
 7                 $http({
 8                     method: 'POST',
 9                     url: '/api/check/' + attrs.ensureUnique,
10                     data: {'field': attrs.ensureUnique}
11                 }).success(function(data, status, headers, cfg) {
12                     c.$setValidity('unique', data.isUnique);
13                 }).error(function(data, status, headers, cfg) {
14                     c.$setValidity('unique', false);
15                 });
16             });
17         }
18     };
19 }]);
View Code

 

 在提交後顯示驗證信息
當用戶試圖提交表單時,你能夠在做用域中捕獲到一個submitted值,而後對錶單內容進行
驗證並顯示錯誤信息。
例如,修改一下前面的例子,只在用戶提交表單時才顯示錯誤信息。在ng-show指令中加入
對錶單是否進行了提交的檢查(後面會實現這個功能):
<form name="signup_form"
novalidate
ng-submit="signupForm()"
ng-controller="signupController">
<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">api

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" >Submit</button>
</fieldset>
</form>
如今,僅當signup_form.submitted設置爲true時,容納錯誤信息的div纔會展現出來。在
signupForm操做中實現這個行爲,以下所示:
app.controller('signupController', function($scope) {
$scope.submitted = false;
$scope.signupForm = function() {
if ($scope.signup_form.$valid) {
// 正常提交
} 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元素上就可使用這個指令,以下所示:<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添加了對應的行爲,添加了一個名爲ng-focused的類,並將$focused的值設置爲true。接下來,能夠根據表單是否具備焦點來展現獨立的錯誤信息。以下所示:<div class="error"ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">在線示例:http://jsbin.com/ePomUnI/7/edit。也能夠在ngModel控制器中使用$isEmpty()方法來判斷輸入字段是否爲空。當輸入字段爲空這個方法會返回true,反之若是不爲空則返回false。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息