国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:33:06
文檔

Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法

Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法:引言 模板驅(qū)動表單相比較響應(yīng)式表單可以少更少的代碼做同樣的事情,可也損失了自由度與更易測試,當(dāng)然很多人并不在乎啦。 所以我相信很多人在編寫Angular不自由自主去更傾向于模板驅(qū)動表單的寫法。 表單最核心的是校驗(yàn)體驗(yàn),在Angular中簡直就是發(fā)揮到了極致
推薦度:
導(dǎo)讀Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法:引言 模板驅(qū)動表單相比較響應(yīng)式表單可以少更少的代碼做同樣的事情,可也損失了自由度與更易測試,當(dāng)然很多人并不在乎啦。 所以我相信很多人在編寫Angular不自由自主去更傾向于模板驅(qū)動表單的寫法。 表單最核心的是校驗(yàn)體驗(yàn),在Angular中簡直就是發(fā)揮到了極致

引言

模板驅(qū)動表單相比較響應(yīng)式表單可以少更少的代碼做同樣的事情,可也損失了自由度與更易測試,當(dāng)然很多人并不在乎啦。

所以我相信很多人在編寫Angular不自由自主去更傾向于模板驅(qū)動表單的寫法。

表單最核心的是校驗(yàn)體驗(yàn),在Angular中簡直就是發(fā)揮到了極致,比如:required、min、max、pattern 等,這些原本是HTML DOM元素中的表述,而Angular默認(rèn)實(shí)現(xiàn)了一整套的校驗(yàn)指令,比如:required 對應(yīng) RequiredValidator。

然后很多時(shí)候我們需要一些特殊的校驗(yàn),比如:數(shù)據(jù)比較、遠(yuǎn)程校驗(yàn)等。那在模板驅(qū)動表單風(fēng)格中我們要如何優(yōu)雅的實(shí)現(xiàn)這樣一個(gè)校驗(yàn)器呢?

一、Angular是如何校驗(yàn)?

一般在編寫一個(gè)手機(jī)文本框可能是這樣:

<input [(ngModel)]="user.mobile" #mobile="ngModel" autocomplete="off" type="tel" class="form-control" name="mobile" required maxlength="11">
<div *ngIf="mobile.errors">
 <p *ngIf="mobile.errors.required">手機(jī)號必填</p>
 <p *ngIf="mobile.errors.pattern">手機(jī)號格式不正確</p>
</div>

以上幾行很友好的實(shí)現(xiàn)從必填項(xiàng)、格式進(jìn)行校驗(yàn),而這一切都是依靠 [(ngModel)] 統(tǒng)一采集,得以只需要利用一個(gè)模板引用變量訪問到每個(gè)校驗(yàn)指令的錯誤信息。

1、[(ngModel)] 到底做了什么?

在解析這個(gè)問題前需要先了解一下 RequiredValidator 是如何定義的。

@Directive({
 providers: [{
 provide: NG_VALIDATORS,
 useExisting: forwardRef(() => RequiredValidator),
 multi: true
 }]
})
export class RequiredValidator {}

只看最核心向 NG_VALIDATORS 標(biāo)識符注冊一個(gè) RequiredValidator 指令。這樣就可以使 ngModel 指令中注入 NG_VALIDATORS 后就能得到這個(gè)指令對象。

ngModel 我把它簡化了一下:

export class NgModel extends NgControl {
 constructor(@Inject(NG_VALIDATORS) validators: Array<Validator|ValidatorFn>) {}
 
 get validator(): ValidatorFn|null {
 // 各種校驗(yàn)并返回結(jié)果
 }
}

有關(guān)更多ng_model.ts可以深入閱讀源代碼。

Angular會在每一次表單值變更時(shí),對所有的表單中已經(jīng)安裝的校驗(yàn)器進(jìn)行一次遍歷。

二、編寫一個(gè)校驗(yàn)器

誠如 required 校驗(yàn)器一樣,依然是把自定義校驗(yàn)器掛到 NG_VALIDATORS 當(dāng)中。假如我們希望手機(jī)文本框只能輸入 159 開頭的一個(gè)校驗(yàn)器。

定義Directive

@Directive({
 selector: '[user-mobile]',
 exportAs: 'userMobile',
 providers: [{
 provide: NG_VALIDATORS,
 useExisting: forwardRef(() => UserMobileDirective),
 multi: true
 }]
})
export class UserMobileDirective {}

一個(gè)非常普通的指令定義方法,只是多了一個(gè)將 UserMobileDirective 注冊到 NG_VALIDATORS 標(biāo)識符當(dāng)中而已。別問我為什么,一種約定。

export class UserMobileDirective implements Validator {
 validate(c: AbstractControl): { [key: string]: any; } {
 let value: string = c.value || '';
 if (!value.startsWith('159')) {
 return {
 mobile: {
 msg: '手機(jī)號必須是159開頭',
 actualValue: value
 }
 };
 }
 return null;
 }
}

只需要實(shí)現(xiàn) Validator 接口的 validate 方法即可。

從 c 中獲取DOM值,當(dāng)遇到非 159 開頭時(shí),返回一個(gè)用于表述消息的對象即可,否則返回一個(gè) null。這個(gè)對象會被統(tǒng)一采集在 ngModel.errors 對象下面。故而,只需要在DOM元素加上 user-mobile 指令即可。

<input user-mobile [(ngModel)]="user.mobile" #mobile="ngModel" autocomplete="off" type="tel" class="form-control" name="mobile" id="mobile" required maxlength="11">
<div *ngIf="mobile.errors">
 <p *ngIf="mobile.errors.required">手機(jī)號必填</p>
 <p *ngIf="mobile.errors.mobile">{{mobile.errors.mobile.msg}}</p>
</div>

接口還包括一個(gè) registerOnValidatorChange 可選方法,當(dāng)某些其它外部屬性的變更時(shí),允許重新手動觸發(fā)校驗(yàn)。

三、異步校驗(yàn)器

如果說用戶手機(jī)校驗(yàn)器需要檢查手機(jī)是否為黑名單的情況下,正常黑名單數(shù)據(jù)都存在遠(yuǎn)程當(dāng)中。這樣情況下需要發(fā)送HTTP請求,而這一過程就是異步。

Angular針對這類異步校驗(yàn)有獨(dú)立的另一個(gè)標(biāo)識符,即:NG_ASYNC_VALIDATORS,而其它代碼都是相通的。

@Directive({
 selector: '[user-async]',
 exportAs: 'userAsync',
 providers: [{
 provide: NG_ASYNC_VALIDATORS,
 useExisting: forwardRef(() => UserAsyncDirective),
 multi: true
 }]
})
export class UserAsyncDirective implements Validator {
 validate(c: AbstractControl): Observable<any> {
 return c.valueChanges
 // 去抖
 .debounceTime(300)
 // 抑制重復(fù)值
 .distinctUntilChanged()
 // 1、可以使用flatMap進(jìn)行遠(yuǎn)程校驗(yàn)
 // .flatMap(value => value)
 // 2、本地模擬判斷
 .map((value: string) => {
 if ([ '15900000001', '15900000002' ].includes(value)) {
 return {
 mobile: {
 msg: '手機(jī)號為黑名',
 actualValue: value
 }
 }
 }
 return null;
 })
 .first(); 
 }
}

除了 NG_ASYNC_VALIDATORS 核心的結(jié)構(gòu)完全沒有變動。

而對于 validate 方法返回的是一個(gè) Observable 類型,利用對 valueChanges 的訂閱可以制作一些像去抖動作。

而最后必須使用 first() 做為結(jié)尾,原因每一次校驗(yàn),對于結(jié)果而言只允許一個(gè)。

結(jié)論

本章介紹的是如何對模板驅(qū)動表單創(chuàng)建自定義校驗(yàn)器,它相比較響應(yīng)式表單自定義校驗(yàn)器略為復(fù)雜一些。但是實(shí)際運(yùn)用中,我們不應(yīng)該只為某個(gè)構(gòu)建表單風(fēng)格做一種自定義校驗(yàn)器,應(yīng)該二者是共存的。

比如上面 159 開頭的示例。更合理的編寫方式應(yīng)該是將校驗(yàn)邏輯獨(dú)立:

export class MyValidators {
 static checkMobile(value: string): ValidationErrors|null {
 return !value.startsWith('159') ? { mobile: { msg: '手機(jī)號必須是159開頭' } } : null;
 }
}
// 校驗(yàn)器類
export class UserMobileDirective implements Validator {
 validate(c: AbstractControl): { [key: string]: any; } {
 let value: string = c.value || '';
 return MyValidators.checkMobile(value);
 }
}

這樣,同一個(gè)校驗(yàn)器,不管是模板驅(qū)動表單還是響應(yīng)式表單,都能是通用的。

總結(jié)

以上所述是小編給大家介紹的Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法

Angular在模板驅(qū)動表單中自定義校驗(yàn)器的方法:引言 模板驅(qū)動表單相比較響應(yīng)式表單可以少更少的代碼做同樣的事情,可也損失了自由度與更易測試,當(dāng)然很多人并不在乎啦。 所以我相信很多人在編寫Angular不自由自主去更傾向于模板驅(qū)動表單的寫法。 表單最核心的是校驗(yàn)體驗(yàn),在Angular中簡直就是發(fā)揮到了極致
推薦度:
標(biāo)簽: 驗(yàn)證 an 驗(yàn)證器
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 视频在线观看国产 | 久久亚洲精品中文字幕60分钟 | 国产一区二区三区视频在线观看 | 午夜视频免费观看 | 成人无高清96免费 | 亚洲视频第一页 | 日韩欧美极品 | 欧美激情一区二区 | 国产精品一区二区不卡 | 亚洲区欧美 | 欧美成人精品一级高清片 | 久久久不卡国产精品一区二区 | 国内久久 | 亚洲精品国产综合久久一线 | 国产成人一区二区三区免费观看 | 久久精品免费 | 欧美中文在线观看 | 久久午夜一区二区 | 日韩精品123 | 97伊人| 草逼电影| 极品美女一区二区三区 | 中文国产成人精品久久96 | 一区二区三区精品 | 欧美2区| 国产日韩视频一区 | 亚洲日本国产 | 不卡在线一区 | 国内精品一区二区三区 | 中文字幕日本一本二本三区 | 精品亚洲一区二区 | 一区二区三区在线免费视频 | 亚洲韩精品欧美一区二区三区 | 五十路亲子中出在线观看 | 91精品一区二区三区久久久久 | 亚洲国产精品免费在线观看 | 亚洲欧美日韩中文v在线 | 亚洲 欧美 日韩在线 | 四虎影院永久免费观看 | 国产精品成人麻豆专区 | 欧美精品午夜久久久伊人 |