Angular跨字段驗(yàn)證器中如何直接調(diào)用其它獨(dú)立的驗(yàn)證器
在angular中關(guān)于表單動(dòng)態(tài)驗(yàn)證的一種新思路一文中我們給出了Angular項(xiàng)目進(jìn)行字段校驗(yàn)的三種方法。本文我們將重點(diǎn)圍繞第一種方法展開(kāi)討論。
假設(shè)有如下應(yīng)用:

該應(yīng)用的功能是對(duì)輸入的數(shù)值的奇偶數(shù)進(jìn)行判斷,如果滿足條件,則啟用Submit按鈕,否則不啟用。
跨字段驗(yàn)證
由于對(duì)輸入數(shù)值的校驗(yàn)是根據(jù)輸入類型來(lái)區(qū)分的,所以這里我們需要一個(gè)跨輸入類型及輸入數(shù)值的驗(yàn)證器:
ngOnInit(): void {
this.formGroup.setValidators((formGroup) => {
formGroup = formGroup as FormGroup;
const type = formGroup.get('type').value as number;
if (type === 0) {
// 驗(yàn)證是否是偶數(shù) 1??
} else {
// 驗(yàn)證是否為奇數(shù) 1??
}
});
}雖然我們可以在1??處直接寫入驗(yàn)證器的邏輯,但從分工的角度上來(lái)講,這往往是最壞的一種的方案。
為此,我們同時(shí)準(zhǔn)備了驗(yàn)證器:
/**
* 數(shù)字校驗(yàn)器
*/
export class NumberValidator {
/**
* 偶數(shù)校驗(yàn)器
*/
static isEven(control: AbstractControl): ValidationErrors | null {
const value = +control.value as number;
if (Number.isInteger(value) && value % 2 === 0) {
return null;
} else {
return { isEven: '輸入的數(shù)字不是偶數(shù)' };
}
}
/**
* 奇數(shù)校驗(yàn)器
*/
static isOdd(control: AbstractControl): ValidationErrors | null {
const value = +control.value as number;
if (Number.isInteger(value) && value % 2 === 1) {
return null;
} else {
return { isOdd: '輸入的數(shù)字不是奇數(shù)' };
}
}
}使用獨(dú)立的驗(yàn)證器
有了獨(dú)立的驗(yàn)證器后,我們可以使用類似如下的代碼,直接在跨字段校驗(yàn)器中進(jìn)行調(diào)用:
ngOnInit(): void {
this.formGroup.setValidators((formGroup) => {
formGroup = formGroup as FormGroup;
const type = formGroup.get('type').value as number;
if (type === 0) {
return NumberValidator.isEven(formGroup.get('value')); ??
} else {
return NumberValidator.isOdd(formGroup.get('value')); ??
}
});
}是的,在調(diào)用的時(shí)候?qū)⑿枰?yàn)證的FormControl傳入即可。
如果我們的跨字段驗(yàn)證器需要同時(shí)對(duì)多個(gè)字段進(jìn)行校驗(yàn),則還可以這樣:
const result = {
...Validators.required(formGroup.get(this.formKeys.image)),
...Validators.required(formGroup.get(this.formKeys.imageLeftTopPoint)),
...Validators.required(formGroup.get(this.formKeys.imageRightBottomPoint)),
...MapPointValidator.isPoint(formGroup.get(this.formKeys.imageLeftTopPoint)),
...MapPointValidator.isPoint(formGroup.get(this.formKeys.imageRightBottomPoint))
}
return Object.keys(result).length === 0 ? null : result; ???? 處對(duì)返回的錯(cuò)誤信息進(jìn)行判斷,如果長(zhǎng)度為0,則說(shuō)明返回了{(lán)},直接返回null,否則返回多個(gè)驗(yàn)證器拼接后的錯(cuò)誤信息。
如果你想看到具體的代碼,請(qǐng)點(diǎn)擊:示例代碼
總結(jié)
到此這篇關(guān)于Angular跨字段驗(yàn)證器中如何直接調(diào)用其它獨(dú)立的驗(yàn)證器的文章就介紹到這了,更多相關(guān)Angular調(diào)用其它獨(dú)立驗(yàn)證器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AngularJS封裝$http.post()實(shí)例詳解
這篇文章主要介紹了 AngularJS封裝$http.post()實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
AngularJs學(xué)習(xí)第八篇 過(guò)濾器filter創(chuàng)建
這篇文章主要介紹了AngularJs學(xué)習(xí)第八篇 過(guò)濾器filter創(chuàng)建的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Angular6 用戶自定義標(biāo)簽開(kāi)發(fā)的實(shí)現(xiàn)方法
這篇文章主要介紹了Angular6 用戶自定義標(biāo)簽開(kāi)發(fā)的實(shí)現(xiàn)方法,下面我們就通過(guò)一個(gè)簡(jiǎn)單的例子演示Angular6中的這一新功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,需要的朋友可以參考下2019-01-01
Angular.JS內(nèi)置服務(wù)$http對(duì)數(shù)據(jù)庫(kù)的增刪改使用教程
我們可以使用內(nèi)置的$http服務(wù)直接同外部進(jìn)行通信。$http服務(wù)只是簡(jiǎn)單的封裝了瀏覽器原生的XMLHttpRequest對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Angular.JS內(nèi)置服務(wù)$http對(duì)數(shù)據(jù)庫(kù)的增刪改等操作的相關(guān)資料,需要的朋友可以參考下。2017-05-05
AngularJS中實(shí)現(xiàn)動(dòng)畫效果的方法
本文主要介紹AngularJS 動(dòng)畫,這里對(duì)動(dòng)畫的資料詳細(xì)介紹并附有效果圖和代碼實(shí)例,有需要的小伙伴參考下2016-07-07
關(guān)于Angular2 + node接口調(diào)試的解決方案
這篇文章主要給大家介紹了關(guān)于Angular2 + node接口調(diào)試的解決方案,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
ng-template 是用來(lái)定義模板的,當(dāng)使用ng-template定義好一個(gè)模板之后,可以用ng-container和templateOutlet指令來(lái)進(jìn)行使用。這篇文章給大家介紹了Angular中的ng-templateangular及使用 ngTemplateOutlet 指令的方法,需要的朋友參考下吧2018-08-08
Angularjs 創(chuàng)建可復(fù)用組件實(shí)例代碼
這篇文章主要介紹了Angularjs 創(chuàng)建可復(fù)用組件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10

