Angular Form Validation

常用的表單驗(yàn)證指令

必填項(xiàng)驗(yàn)證

判斷輸入表單是否已經(jīng)填寫,只需要在輸入字段上添加HTML5標(biāo)記required即可:

<input type="text" required />

還有一個(gè)ng-required可以控制該項(xiàng)是否是必填的

<input type="text" ng-required="true" />

最小值

驗(yàn)證表單的輸入的數(shù)值是否大于某一個(gè)最小值,在輸入字段上用指令min="{number}":

<input type="number" ng-model="user.score" min="10" />

最大值

驗(yàn)證表單的輸入值是否小于等于某一個(gè)最大值昙沦,在輸入字段上用指令max="{number}":

<input type="number" ng-model="user.score" max="100" />

最小長(zhǎng)度

驗(yàn)證表單輸入的文本長(zhǎng)度是否大于某個(gè)最小值切省,在輸入字段上使用指令ng-minlength="{number}":

<input type="text" ng-minlength="5" />

最大長(zhǎng)度驗(yàn)證

驗(yàn)證表單輸入的文本長(zhǎng)度是否小于或者等于某個(gè)最大值爸黄,在輸入字段上使用指令ng-maxlength="{number}":

<input type="text" ng-maxlength="20" />

模式匹配

使用ng-pattern="/PATTERN/"來確保輸入能夠匹配指定的正則表達(dá)式:

<input type="text" ng-pattern="/[a-zA-Z]/" />

電子郵件

驗(yàn)證輸入內(nèi)容是否是電子郵件搁凸,只要將input的類型設(shè)置為email即可:

<input type="email"  name="email" ng-model="user.email" />

數(shù)字

驗(yàn)證輸入內(nèi)容是否是數(shù)字萌朱,將input的類型設(shè)置為number:

<input type="number" name="age" ng-model="user.age" />

URL

驗(yàn)證輸入內(nèi)容是否是URL屠阻,將input的類型設(shè)置為url:

<input type="url" name="homepage" ng-model="user.homepage" />

出錯(cuò)時(shí)angular添加的class

表單狀態(tài) 應(yīng)用的CSS
$invalid ng-invalid
$valid ng-valid
$pristine ng-pristine
$dirty ng-dirty
指令 應(yīng)用的CSS
required或者ng-required ng-valid-required或者ng-invalid-required
min ng-valid-min或ng-invalid-min
max ng-valid-max或ng-invalid-max
ng-pattern ng-valid-pattern或ng-invalid-pattern
type="url" ng-valid-url或ng-invalid-url
type="email" ng-valid-email或ng-invalid-email
type="date" ng-valid-date或ng-invalid-date
type="number" ng-valid-number或ng-invalid-number

禁用HTML5默認(rèn)的表單驗(yàn)證

在form上添加novalidate屬性红省,就可以禁用HTML5自帶的驗(yàn)證

獲取表單中各個(gè)field的狀態(tài)

未修改過的field

布爾值屬性,表示用戶是否修改了該字段国觉。如果為true吧恃,表示沒有修改過;false表示修改過:

formName.inputFieldName.$pristine;

修改過的field

布爾型屬性麻诀,當(dāng)且僅當(dāng)用戶實(shí)際已經(jīng)修改過的字段蚜枢。不管字段是否有效:

formName.inputFieldName.$dirty;

經(jīng)過驗(yàn)證的字段

布爾型屬性,它指字段是否通過驗(yàn)證针饥。如果通過厂抽,它將為true:

formName.inputFieldName.$valid

未通過驗(yàn)證的表單

formName.inputFieldName.$invalid

何時(shí)可以在$scope中取到表單中各個(gè)字段的狀態(tài)

angular的驗(yàn)證是由form指令和ngModel協(xié)調(diào)完成的。當(dāng)驗(yàn)證控件沒有name屬性的時(shí)是不會(huì)被form捕獲的丁眼。下面讓我們從angular的源碼中看起:

首先是ngModel:

var ngModelDirective = function() {
     return {
       require: ['ngModel', '^?form'],
       controller: NgModelController,
       link: function(scope, element, attr, ctrls) {
         // notify others, especially parent forms
 
         var modelCtrl = ctrls[0],
             formCtrl = ctrls[1] || nullFormCtrl;
 
         formCtrl.$addControl(modelCtrl);
 
         scope.$on('$destroy', function() {
           formCtrl.$removeControl(modelCtrl);
         });
       }
     };
   };

從上面我們可以看出來ngModel指令會(huì)在編譯時(shí)期的post link階段會(huì)通過form的addControl方法把自己的controller注冊(cè)到父節(jié)點(diǎn)的form的formController中筷凤。再看看ngModelController初始化代碼:

var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', 
  function($scope, $exceptionHandler, $attr, $element, $parse) { 
    ....
   this.$pristine = true; 
   this.$dirty = false; 
   this.$valid = true; 
   this.$invalid = false; 
   this.$name = $attr.name;

從上面我們可以看到ngModel的$name屬性并不支持表達(dá)式計(jì)算。而FormController的addControl代碼則是:

/**
     * @ngdoc function
     * @name ng.directive:form.FormController#$addControl
     * @methodOf ng.directive:form.FormController
     *
     * @description
     * Register a control with the form.
     *
     * Input elements using ngModelController do this automatically when they are linked.
     */
    form.$addControl = function(control) {
      // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
      // and not added to the scope.  Now we throw an error.
      assertNotHasOwnProperty(control.$name, 'input');
      controls.push(control);

      if (control.$name) {
        form[control.$name] = control;
      }
    };

從上面我們可以清楚的看見雖然ngModel注冊(cè)了自己,但是這里也不一定能注冊(cè)成功藐守,ngModel必須有自己的$name才能被注冊(cè)成功挪丢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卢厂,隨后出現(xiàn)的幾起案子乾蓬,更是在濱河造成了極大的恐慌,老刑警劉巖慎恒,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件任内,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡融柬,警方通過查閱死者的電腦和手機(jī)死嗦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒氧,“玉大人越除,你說我怎么就攤上這事⊥舛ⅲ” “怎么了摘盆?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饱苟。 經(jīng)常有香客問我骡澈,道長(zhǎng),這世上最難降的妖魔是什么掷空? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任肋殴,我火速辦了婚禮,結(jié)果婚禮上坦弟,老公的妹妹穿的比我還像新娘护锤。我一直安慰自己,他們只是感情好酿傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布烙懦。 她就那樣靜靜地躺著,像睡著了一般赤炒。 火紅的嫁衣襯著肌膚如雪氯析。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天莺褒,我揣著相機(jī)與錄音掩缓,去河邊找鬼。 笑死遵岩,一個(gè)胖子當(dāng)著我的面吹牛你辣,可吹牛的內(nèi)容都是我干的巡通。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼舍哄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宴凉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起表悬,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤弥锄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蟆沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籽暇,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年饥追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了图仓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罐盔。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡但绕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惶看,到底是詐尸還是另有隱情捏顺,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布纬黎,位于F島的核電站幅骄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏本今。R本人自食惡果不足惜拆座,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠息。 院中可真熱鬧挪凑,春花似錦、人聲如沸逛艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽散怖。三九已至菇绵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镇眷,已是汗流浹背咬最。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欠动,地道東北人丹诀。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親铆遭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硝桩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 過濾器用來格式化需要展示給用戶的數(shù)據(jù)。AngularJS有很多實(shí)用的內(nèi)置過濾器枚荣,同時(shí)也提供了方便的途徑可以自己創(chuàng)建...
    oWSQo閱讀 1,085評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理碗脊,服務(wù)發(fā)現(xiàn),斷路器橄妆,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 基礎(chǔ)ng屬性指令 布爾屬性 布爾屬性代表一個(gè)true或false值衙伶。當(dāng)這個(gè)屬性出現(xiàn)時(shí),這個(gè)屬性的值就是true(無...
    oWSQo閱讀 1,181評(píng)論 0 0
  • ng-model 指令ng-model 指令 綁定 HTML 元素 到應(yīng)用程序數(shù)據(jù)害碾。ng-model 指令也可以:...
    壬萬er閱讀 861評(píng)論 0 2
  • AngularJSAngularJS 是一個(gè) MV* 框架矢劲, 最適于開發(fā)客戶端的單頁面應(yīng)用。它不是個(gè)功能庫慌随,...
    一直以來都很好閱讀 890評(píng)論 0 0