Angular2表單自定義驗(yàn)證器的實(shí)現(xiàn)
本文主要給大家介紹如何判斷驗(yàn)證器的結(jié)果。在這里,我們就來看看怎樣實(shí)現(xiàn)一個(gè)自定義的驗(yàn)證器。
目標(biāo)
我們要實(shí)現(xiàn)一個(gè)驗(yàn)證手機(jī)號(hào)的驗(yàn)證器,使用的實(shí)例還是基于之前的文章里面的實(shí)例,也就是用戶信息輸入的表單頁面。我們?cè)谑謾C(jī)號(hào)的元素上添加一個(gè)驗(yàn)證手機(jī)號(hào)的驗(yàn)證器。然后,如果手機(jī)號(hào)驗(yàn)證失敗,就顯示一個(gè)錯(cuò)誤,頁面如下:
這部分教程的代碼可以從github獲取:
git clone
https://github.com/Mavlarn/angular2-forms-tutorial
如果要運(yùn)行,進(jìn)入項(xiàng)目目錄,運(yùn)行下面的命令安裝依賴然后運(yùn)行測(cè)試服務(wù)器:
cd angular2-forms-tutorial git checkout model-driven # 檢出該文所使用的tag npm install npm start
實(shí)現(xiàn)驗(yàn)證器
在Angular2中,實(shí)現(xiàn)一個(gè)驗(yàn)證器非常簡(jiǎn)單,就是一個(gè)方法就可以,該方法的參數(shù)是一個(gè)FormControl,結(jié)果是一個(gè)錯(cuò)誤對(duì)象或者null。用TypeScript接口表示,就是這樣:
interface Validator<T extends FormControl> { (c:T): {[error: string]:any}; }
如果是對(duì)類似Java這樣的面向?qū)ο笳Z言比較了解的話,上面的接口定義就很容易理解。其中<T extends FormControl>是指這個(gè)方法中用到一個(gè)泛型T,它是一個(gè)繼承自FormControl的對(duì)象。(c:T): {[error: string]:any};這是一個(gè)lambda表達(dá)式的方法定義,參數(shù)c的類型為T,這個(gè)方法返回一個(gè)對(duì)象。
我們創(chuàng)建一個(gè)名為mobile.validator.ts的文件,它的內(nèi)容如下:
import { FormControl } from '@angular/forms'; export function validateMobile(c: FormControl) { let MOBILE_REGEXP = /^1[0-9]{10,10}$/; return MOBILE_REGEXP.test(c.value) ? null : { validateMobile: {valid: false} } }
在這個(gè)驗(yàn)證方法里,參數(shù)c的類型為FormControl,也就是表單控件,他有一個(gè)value屬性,存放當(dāng)前的值。我們使用正則表達(dá)式,來判斷這個(gè)值是否合法。如果不合法,就返回一個(gè)對(duì)象。
在之前的教程中,我們對(duì)驗(yàn)證器的驗(yàn)證結(jié)果是這樣獲得的:
<p *ngIf="userForm.controls.mobile?.errors?.required">必須輸入電話</p>
userForm.controls.mobile就是表單中手機(jī)號(hào)這個(gè)控件,required是required驗(yàn)證器對(duì)應(yīng)的key,當(dāng)required驗(yàn)證器驗(yàn)證失敗時(shí),就會(huì)在errors里面添加一個(gè)值:
{ required: {valid: false} }
所以,我們實(shí)現(xiàn)的自定義的驗(yàn)證器,也要把驗(yàn)證結(jié)果用驗(yàn)證器的名字作為key,放到errors里面,就是這樣:
{ validateMobile: {valid: false} }
這樣,我們就能夠在頁面中用跟之前同樣的方式來獲得這個(gè)驗(yàn)證器的驗(yàn)證結(jié)果。
在模型驅(qū)動(dòng)的表單里添加驗(yàn)證器
接下來,我們把我們實(shí)現(xiàn)的驗(yàn)證器添加到我們的表單里,先加到模型驅(qū)動(dòng)的表單里:
import { validateMobile } from '../validators/mobile.validator'; export class ReactiveFormsComponent implements OnInit { this.userForm = this.formBuilder.group({ // ... 省略其他控件 mobile: [13800138001, [Validators.required, Validators.minLength(11), Validators.maxLength(11), validateMobile]] }); ... }
上面的代碼省略了其他的部分,完整的代碼,請(qǐng)參考github。
在上面的代碼中,我們引入了之前實(shí)現(xiàn)的自定義的驗(yàn)證器,然后在表單控件創(chuàng)建代碼中,對(duì)mobile控件加了一個(gè)validateMobile。
這樣,我們?cè)陧撁嫔咸砑酉鄳?yīng)的驗(yàn)證結(jié)果信息:
<p *ngIf="userForm.controls.mobile.errors?.validateMobile">電話號(hào)碼格式不正確</p>
這樣就完成了驗(yàn)證器,以及在頁面顯示驗(yàn)證結(jié)果,就這么簡(jiǎn)單。
在模板驅(qū)動(dòng)的表單里添加驗(yàn)證器
但是,如果我們的表單不是在組件里用模型驅(qū)動(dòng)的方式創(chuàng)建的,而是在頁面上用html元素創(chuàng)建的,那么使用自定義的驗(yàn)證器就稍微麻煩一點(diǎn)。
在一個(gè)模板驅(qū)動(dòng)的表單里,我們是這樣使用驗(yàn)證器的:
<input type="text" name="mobile" [(ngModel)]="user.mobile" #mobile="ngModel" required minlength="11" maxlength="11"> <span *ngIf="mobile.valid">有效</span> <div [hidden]="mobile.valid || mobile.pristine"> <p *ngIf="mobile.errors?.minlength || mobile.errors?.maxlength">電話長(zhǎng)度必須為11</p> <p *ngIf="mobile.errors?.required">必須輸入姓名</p> </div>
也就是在input輸入元素的屬性中添加驗(yàn)證器。那么,我們要實(shí)現(xiàn)自己的驗(yàn)證器在表單里面使用,除了上面的驗(yàn)證器方法里面,還需要2件事情:
我們需要將這個(gè)驗(yàn)證器定義成一個(gè)指令Directive,這樣Angular在解析這段html的時(shí)候,會(huì)識(shí)別我們自定義的驗(yàn)證器指令。
我們還需要Angular的驗(yàn)證器調(diào)用我們的驗(yàn)證方法。
所以,在之前的mobile.validator.ts文件里,添加下面的指令定義:
@Directive({ selector: '[validateMobile][ngModel]' }) export class MobileValidator {}
這段代碼很簡(jiǎn)單,就是用@Directive標(biāo)簽定義了一個(gè)指令MobileValidator,它作用的元素是同時(shí)具有validateMobile和ngModel屬性的元素。這樣,我們就可以在手機(jī)號(hào)的元素上添加一個(gè)屬性,來使這個(gè)驗(yàn)證器指令起作用。
然后,我們還需要Angular的驗(yàn)證器框架能夠調(diào)用我們的驗(yàn)證方法,這就需要NG_VALIDATORS。我們修改上面的驗(yàn)證器的指令定義如下:
@Directive({ selector: '[validateMobile][ngModel]', providers: [ { provide: NG_VALIDATORS, useValue: validateMobile, multi: true } ] }) export class MobileValidator {}
這樣Angular的驗(yàn)證器就能夠?qū)alidateMobile方法應(yīng)用在這個(gè)指令上。
最后,我們?cè)侔堰@個(gè)新的指令,添加到AppModule的declarations里面,就可以在頁面上使用這個(gè)驗(yàn)證器了。
最后,頁面上使用驗(yàn)證器的代碼如下:
<input type="text" name="mobile" [(ngModel)]="user.mobile" #mobile="ngModel" required minlength="11" maxlength="11" validateMobile> <span *ngIf="mobile.valid">有效</span> <div [hidden]="mobile.valid || mobile.pristine"> <p *ngIf="mobile.errors?.minlength || mobile.errors?.maxlength">電話長(zhǎng)度必須為11</p> <p *ngIf="mobile.errors?.required">必須輸入姓名</p> <p *ngIf="mobile.errors?.validateMobile">電話號(hào)碼格式不正確</p> </div>
以上所述是小編給大家介紹的Angular2表單自定義驗(yàn)證器,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 詳解Angular開發(fā)中的登陸與身份驗(yàn)證
- AngularJS實(shí)現(xiàn)表單驗(yàn)證
- AngularJS使用ngMessages進(jìn)行表單驗(yàn)證
- AngularJS實(shí)現(xiàn)表單手動(dòng)驗(yàn)證和表單自動(dòng)驗(yàn)證
- 詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證
- angular實(shí)現(xiàn)表單驗(yàn)證及提交功能
- Angular2使用Guard和Resolve進(jìn)行驗(yàn)證和權(quán)限控制
- 教你用AngularJS框架一行JS代碼實(shí)現(xiàn)控件驗(yàn)證效果
- AngularJs驗(yàn)證重復(fù)密碼的方法(兩種)
- angular異步驗(yàn)證防抖踩坑實(shí)錄
相關(guān)文章
AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法
今天小編就為大家分享一篇AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Angular.js中$apply()和$digest()的深入理解
相信大家都知道$digest()和$apply()是AngularJS中的兩個(gè)核心并且有時(shí)候容易引人誤解的部分。我們需要深入理解這兩者是如何運(yùn)作的,從而才能理解AngularJS本身是如何運(yùn)作的。本文的目的就是介紹$digest()和$apply()是如何確確實(shí)實(shí)的對(duì)你有用的。下面來一起看看吧。2016-10-10詳解JavaScript的AngularJS框架中的表達(dá)式與指令
這篇文章主要介紹了JavaScript的AngularJS框架中的表達(dá)式與指令,文中羅列了幾個(gè)常用的指令屬性加以說明,需要的朋友可以參考下2016-03-03詳解創(chuàng)建自定義的Angular Schematics
本文對(duì) Angular Schematics 進(jìn)行了介紹,并創(chuàng)建了一個(gè)用于創(chuàng)建自定義 Component 的 Schematics ,然后在 Angular 項(xiàng)目中以它為模板演練了通過 Schematics 添加自定義的 Component,感興趣的小伙伴們可以參考一下2018-06-06AngularJS實(shí)現(xiàn)select的ng-options功能示例
這篇文章主要介紹了AngularJS實(shí)現(xiàn)select的ng-options功能,結(jié)合實(shí)例形式分析了AngularJS使用ng-options操作select列表的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07