AngularJS實(shí)現(xiàn)表單驗(yàn)證
雖然我不是前端程序員,但明白前端做好驗(yàn)證是多么重要。
因?yàn)檫@樣后端就可以多喘口氣了,而且相比后端什么的果然還是前端可以提高用戶的幸福感。
AngularJS提供了很方便的表單驗(yàn)證功能,在此記錄一番。
首先從下面這段代碼開始
<form ng-app="myApp" ng-controller="validationController" name="mainForm" novalidate>
<p>Email:
<input type="email" name="email" ng-model="email" required>
<span style="color:red" ng-show="mainForm.email.$dirty && mainForm.email.$invalid">
<span ng-show="mainForm.email.$error.required">Email is required.</span>
<span ng-show="mainForm.email.$error.email">Invalid email address.</span>
</span>
</p>
<p>
<input type="submit" ng-disabled="mainForm.$invalid">
</p>
</form>
<script>
angular.module('myApp',[])
.controller('validationController', ['$scope',function($scope) {
$scope.user = 'Kavlez';
$scope.email = 'sweet_dreams@aliyun.com';
}]);
</script>
input標(biāo)簽的一些驗(yàn)證選項(xiàng),通常和HTML5標(biāo)記搭配使用。
必填
<input type="text" required />
長度
使用指令ng-minlength/ng-maxlength
<input type="text" ng-minlength="5" />
特定格式
例如電子郵件、URL、數(shù)字,將type設(shè)置為相應(yīng)類型即可,例如:
<input type="email" name="email" ng-model="user.email" />
<input type="number" name="age" ng-model="user.age" />
<input type="url" name="homepage" ng-model="user.facebook_url" />
模式匹配
使用指令ng-pattern,例如:
<input type="text" ng-pattern="[a-z]" />
表單屬性,通過這些屬性可以更容易地對表單進(jìn)行操作
pristine/dirty
表示是否已修改,例如
<form name="mainForm" ng-controller="orderController">
<input type="email" name="userEmail" ng-model="myEmail" />
{{mainForm.userEmail.$pristine}}
{{mainForm.userEmail.$dirty}}
</form>
以formName.fieldName.$pristine方式訪問,input必須有ng-model聲明。
valid/invalid
表示是否通過驗(yàn)證。
$error
表單驗(yàn)證信息,驗(yàn)證不通過時返回相應(yīng)信息。
AngularJS為表單狀態(tài)提供了相應(yīng)地css class
.ng-pristine
.ng-dirty
.ng-valid
.ng-invalid
例如,讓驗(yàn)證通過為綠色,失敗為紅色:
input.ng-valid {
color: green;
}
input.ng-invalid {
color: green;
}
給出的例子中僅僅是一個email的驗(yàn)證就寫了這么多,如果再加幾個field,再加幾種不同的提示,再加上幾個事件,代碼會變得雜亂不堪。
事實(shí)上并不推薦這樣做,我們有更好的方法。
就是使用angular-messages.js
首先,不要忘了這兩步
<script src="angular-messages.js"></script>
angular.module('myApp', ['ngMessages'])
好,先用ng-messages和ng-message替換掉那些重復(fù)的東西,上面的例子變成:
<form ng-controller="validationController" name="mainForm" >
<p>Email:
<input
type="email" name="email" ng-model="myEmail" ng-minlength="3" ng-maxlength="50" required />
<div style="color:red" ng-messages="mainForm.email.$error" ng-messages-multiple>
<p class="error" ng-message="required">Email is required.</p>
<p class="error" ng-message="email">Invalid email address.</p>
<p class="error" ng-message="minlength">min length 10</p>
<p class="error" ng-message="maxlength">max length 50</p>
</div>
</p>
<p>
<input type="submit" ng-disabled="mainForm.$invalid" />
</p>
</form>
功能上沒有任何變化,只是把重復(fù)的代碼全部去掉了。
注意區(qū)分ng-messasges和ng-message,有沒有感覺有點(diǎn)像with()? 后面的ng-messages-multiple,這里用作同時讓多個提示出現(xiàn)。
但這樣仍然不夠好,就算省去了ng-message中的內(nèi)容,但是多個field中都存在required驗(yàn)證時仍然會有重復(fù)。
而且,如果不同頁面中的表單都涉及到相同的內(nèi)容時重復(fù)的驗(yàn)證提示會越來越多。
為了解決這個問題,我們可以使用ng-messages-include指令。
該指令用來引用模板,比如上面的例子變?yōu)?
<form ng-controller="validationController" name="mainForm" >
<p>Email:
<input
type="email" name="email" ng-model="myEmail" ng-minlength="3" ng-maxlength="50" required />
<div style="color:red" ng-messages="mainForm.email.$error" ng-messages-multiple ng-messages-include="validateTemplate/email.html">
</div>
</p>
<p>
<input type="submit" ng-disabled="mainForm.$invalid" />
</p>
</form>
并不復(fù)雜,我們再加點(diǎn)東西。
為了讓提示更友好(?)一些,我們試試實(shí)現(xiàn)光標(biāo)離開后出現(xiàn)提示的效果。
這時候用指令(directive)會方便很多,在這里先涉及一點(diǎn)和指令相關(guān)的內(nèi)容。
先運(yùn)行起來再說:
var myApp = angular.module('myApp',[])
.controller('validationController', ['$scope',function($scope) {
$scope.user = 'Kavlez';
$scope.email = 'sweet_dreams@aliyun.com';
}])
.directive('hintOnBlur', [function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
ctrl.focused = false;
element.bind('focus', function(evt) {
scope.$apply(function() {ctrl.focused = true;});
}).bind('blur', function(evt) {
scope.$apply(function() {ctrl.focused = false;});
});
}
}
}]);
此處我們用focused來判斷光標(biāo)是否在某個屬性上,當(dāng)使用了hintOnBlur指令的對象上發(fā)生focus或blur事件時focused的狀態(tài)發(fā)生變化。
表單也跟著改變一下,使用方法如下:
<form ng-controller="validationController" name="mainForm" >
<p>Email:
<input type="email" name="email" ng-model="myEmail" ng-minlength="3" ng-maxlength="50" required hint-on-blur />
<div style="color:red" ng-messages="mainForm.email.$error" ng-show="!mainForm.email.focused" ng-messages-multiple ng-messages-include="validateTemplate/email.html">
</div>
</p>
<p>
<input type="submit" ng-disabled="mainForm.$invalid" />
</p>
</form>
在ng-show中再加入對focused的判斷,false時出現(xiàn)提示。
現(xiàn)在看起來像那么回事了。
自定義驗(yàn)證方式與有效性(validity),這個也用到指令(directive)。
驗(yàn)證填寫的email是否已占用,這里簡單模擬一下:
.directive('isAlreadyTaken', function() {
return {
require: 'ngModel',
link: function(scope, ele, attrs, ctrl) {
ctrl.$parsers.push(function(val) {
ctrl.$setValidity('emailAvailable', false);
var emailTable = [
'K@gmail.com',
'a@gmail.com',
'v@gmail.com',
'l@gmail.com',
'e@gmail.com',
'z@gmail.com'];
for (var i=0;i<emailTable.length;i+=1)
if(val==emailTable[i])
return;
ctrl.$setValidity('emailAvailable', true);
return val;
})
}
}
})
Input元素中加上is-already-taken屬性,并且再加一個ng-message:
<p class="error" ng-message="emailAvailable">Already taken! try other email addresses!</p>
- jquery validate.js表單驗(yàn)證的基本用法入門
- js 常用正則表達(dá)式表單驗(yàn)證代碼
- JavaScript表單驗(yàn)證完美代碼
- JavaScript 表單驗(yàn)證正則表達(dá)式大全[推薦]
- javascript制作的簡單注冊模塊表單驗(yàn)證
- js正則表達(dá)式注冊頁面表單驗(yàn)證
- jquery表單驗(yàn)證插件(jquery.validate.js)的3種使用方式
- JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空
- AngularJS使用ngMessages進(jìn)行表單驗(yàn)證
- JavaScript實(shí)現(xiàn)簡單表單驗(yàn)證案例
相關(guān)文章
Angular實(shí)現(xiàn)跨域(搜索框的下拉列表)
angular.js 自帶jsonp,實(shí)現(xiàn)跨域,下面來實(shí)現(xiàn)搜索框的下拉列表功能,本文思路明確,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-02-02詳解AngularJs中$sce與$sceDelegate上下文轉(zhuǎn)義服務(wù)
這篇文章給大家詳細(xì)介紹了AngularJs提供的嚴(yán)格上下文轉(zhuǎn)義服務(wù)$sce與$sceDelegate,文中介紹的很詳細(xì),有需要的朋友們可以參考借鑒。2016-09-09AngularJS基礎(chǔ) ng-switch 指令簡單示例
本文主要講解AngularJS ng-switch 指令,這里對ng-switch 指令的基礎(chǔ)資料做了詳細(xì)整理,并附代碼示例,有興趣的小伙伴可以參考下2016-08-08angularJs-$http實(shí)現(xiàn)百度搜索時的動態(tài)下拉框示例
下面小編就為大家分享一篇angularJs-$http實(shí)現(xiàn)百度搜索時的動態(tài)下拉框示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02ionic+AngularJs實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時按鈕
本篇文章主要介紹了ionic+AngularJs實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時按鈕,具有一定的參考價值,有興趣的可以了解一下。2017-04-04Angular應(yīng)用的多語言設(shè)置問題解決示例
這篇文章主要為大家介紹了Angular應(yīng)用的多語言設(shè)置問題解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07