亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

AngularJS實現表單驗證

2019-11-20 13:18:37
字體:
來源:轉載
供稿:網友

雖然我不是前端程序員,但明白前端做好驗證是多么重要。

因為這樣后端就可以多喘口氣了,而且相比后端什么的果然還是前端可以提高用戶的幸福感。

AngularJS提供了很方便的表單驗證功能,在此記錄一番。

首先從下面這段代碼開始

復制代碼 代碼如下:

<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標簽的一些驗證選項,通常和HTML5標記搭配使用。

必填

<input type="text" required />
長度

使用指令ng-minlength/ng-maxlength

<input type="text" ng-minlength="5" />
特定格式
例如電子郵件、URL、數字,將type設置為相應類型即可,例如:

復制代碼 代碼如下:

<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]" />

表單屬性,通過這些屬性可以更容易地對表單進行操作

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

表示是否通過驗證。

復制代碼 代碼如下:

$error

表單驗證信息,驗證不通過時返回相應信息。

AngularJS為表單狀態提供了相應地css class

復制代碼 代碼如下:

.ng-pristine
.ng-dirty
.ng-valid
.ng-invalid

例如,讓驗證通過為綠色,失敗為紅色:

復制代碼 代碼如下:

input.ng-valid {
    color: green;
}
input.ng-invalid {
    color: green;
}

給出的例子中僅僅是一個email的驗證就寫了這么多,如果再加幾個field,再加幾種不同的提示,再加上幾個事件,代碼會變得雜亂不堪。

事實上并不推薦這樣做,我們有更好的方法。
就是使用angular-messages.js

首先,不要忘了這兩步

復制代碼 代碼如下:

<script src="angular-messages.js"></script>
angular.module('myApp', ['ngMessages'])

好,先用ng-messages和ng-message替換掉那些重復的東西,上面的例子變成:

復制代碼 代碼如下:

<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>

功能上沒有任何變化,只是把重復的代碼全部去掉了。
注意區分ng-messasges和ng-message,有沒有感覺有點像with()? 后面的ng-messages-multiple,這里用作同時讓多個提示出現。

但這樣仍然不夠好,就算省去了ng-message中的內容,但是多個field中都存在required驗證時仍然會有重復。
而且,如果不同頁面中的表單都涉及到相同的內容時重復的驗證提示會越來越多。
為了解決這個問題,我們可以使用ng-messages-include指令。
該指令用來引用模板,比如上面的例子變為:

復制代碼 代碼如下:

<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>

并不復雜,我們再加點東西。
為了讓提示更友好(?)一些,我們試試實現光標離開后出現提示的效果。
這時候用指令(directive)會方便很多,在這里先涉及一點和指令相關的內容。

先運行起來再說:

復制代碼 代碼如下:

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來判斷光標是否在某個屬性上,當使用了hintOnBlur指令的對象上發生focus或blur事件時focused的狀態發生變化。

表單也跟著改變一下,使用方法如下:

復制代碼 代碼如下:

<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時出現提示。

現在看起來像那么回事了。
自定義驗證方式與有效性(validity),這個也用到指令(directive)。
驗證填寫的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>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有精品丝袜| 国产69精品久久久久久| 91久久久亚洲精品| 久久久噜久噜久久综合| 亚洲精品免费网站| 国产丝袜精品视频| 亚洲a成v人在线观看| 日产日韩在线亚洲欧美| 亚洲综合精品一区二区| 国产精品成熟老女人| 国产一区二区三区高清在线观看| 性亚洲最疯狂xxxx高清| 欧美精品久久久久久久久| 亚洲精品不卡在线| 成人福利在线视频| 国产成人精品久久二区二区| 国产做受高潮69| 成人欧美一区二区三区在线湿哒哒| 91中文字幕一区| 亚洲一区二区三区四区在线播放| 日韩在线欧美在线| 亚洲国产精品系列| 中文字幕无线精品亚洲乱码一区| 亚洲少妇激情视频| 国产精品视频公开费视频| 久久福利视频导航| 欧美在线视频免费观看| 日本在线观看天堂男亚洲| 日韩精品丝袜在线| 成人av电影天堂| 狠狠久久五月精品中文字幕| 成人性生交大片免费看视频直播| 亚洲女同性videos| 亚洲伊人久久大香线蕉av| 久久久精品久久久久| 欧美激情久久久| 久久久999精品免费| 91福利视频网| 国产精品日韩电影| 日韩天堂在线视频| 日韩欧美国产免费播放| 日韩欧美中文字幕在线播放| 国产精品视频xxx| 久久欧美在线电影| 亚洲一区美女视频在线观看免费| 91免费的视频在线播放| 亚洲精品久久久久中文字幕二区| 日韩中文有码在线视频| 热99久久精品| 亚洲欧美www| 在线亚洲欧美视频| 国产精欧美一区二区三区| 91高清在线免费观看| 亚洲自拍偷拍网址| 欧美俄罗斯乱妇| 97香蕉久久夜色精品国产| 日韩成人av一区| 91精品国产777在线观看| 日韩精品中文字幕在线| 欧美高清在线观看| 亚洲精品suv精品一区二区| 欧美精品videossex性护士| 国产精品视频26uuu| 91久久久久久久久久| 91精品国产91久久久久久吃药| 91网站免费观看| 久久男人的天堂| 亚洲最新av在线网站| 国产精品黄页免费高清在线观看| 国产主播精品在线| 国产情人节一区| 日韩美女视频免费在线观看| 国产精品99久久久久久白浆小说| 久久香蕉国产线看观看av| 中文字幕亚洲欧美日韩在线不卡| 日韩中文字幕在线视频播放| 欧美又大又硬又粗bbbbb| 中文字幕在线成人| 亚洲欧美日韩综合| 欧美亚洲日本黄色| 超碰97人人做人人爱少妇| 色噜噜狠狠狠综合曰曰曰88av| 96精品久久久久中文字幕| 午夜精品一区二区三区视频免费看| 色青青草原桃花久久综合| 国产精品1区2区在线观看| 亚洲国产日韩欧美在线动漫| 欧美高清视频在线观看| 国产精品一区专区欧美日韩| 国产乱肥老妇国产一区二| 亚洲成人久久久| 国产高清在线不卡| 中文字幕欧美日韩| 菠萝蜜影院一区二区免费| 亚洲国产精品高清久久久| 国产69精品久久久久9999| 国产亚洲精品久久久优势| 国产精品美女主播| 欧美激情视频一区| 日韩在线视频免费观看| 日韩美女免费线视频| 66m—66摸成人免费视频| 亚洲色图18p| 在线观看国产欧美| 欧美激情欧美狂野欧美精品| 亚洲一区二区中文字幕| 欧美大片欧美激情性色a∨久久| 91免费看片网站| 国产丝袜一区二区三区免费视频| 中文字幕欧美精品在线| 国产亚洲欧美日韩精品| 久久久国产一区二区三区| 精品久久久久久久久久国产| 日韩专区中文字幕| 亚洲欧美制服综合另类| 日韩**中文字幕毛片| 欧美重口另类videos人妖| 欧美夫妻性生活xx| 日韩av免费在线| 亚洲品质视频自拍网| 亚洲精品一区久久久久久| 狠狠色香婷婷久久亚洲精品| 亚洲国产中文字幕久久网| 欧美精品在线第一页| 成人性生交大片免费看小说| 美日韩丰满少妇在线观看| 亚洲一区久久久| 亚洲电影天堂av| 青青在线视频一区二区三区| 国产精品视频永久免费播放| 国产精品1234| 国产欧美日韩精品丝袜高跟鞋| 亚洲综合中文字幕在线观看| 亚洲美女av网站| 亚洲第一综合天堂另类专| 亚洲美女在线看| 欧美激情亚洲综合一区| 国产成人自拍视频在线观看| 国产一区二区色| 98视频在线噜噜噜国产| 欧美性生活大片免费观看网址| 国产精品久久久久免费a∨大胸| 国产97在线观看| 国产精品久久久一区| 久久影视电视剧凤归四时歌| 久久综合亚洲社区| 成人网页在线免费观看| 最近2019年手机中文字幕| 成人自拍性视频| 日韩电影中文字幕在线| 亚洲激情在线观看| 青青a在线精品免费观看| 91在线视频精品| 久久香蕉频线观| 久精品免费视频| 日韩av片电影专区| 最近2019年日本中文免费字幕| 欧美午夜激情小视频| 国产成人精品日本亚洲| 久久久久久噜噜噜久久久精品| 黄网站色欧美视频| 欧美激情一区二区三级高清视频| 亚洲精品美女视频| 萌白酱国产一区二区|