這篇文章主要介紹了Angular如何實(shí)現(xiàn)Reactive Form表單驗(yàn)證,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過多達(dá)十年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的網(wǎng)絡(luò)營(yíng)銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都宣傳片制作等企業(yè),備受客戶贊許。
基礎(chǔ)知識(shí)
內(nèi)建驗(yàn)證規(guī)則
Angular 提供了一些內(nèi)建的 validators,我們可以在 Template-Driven 或 Reactive 表單中使用它們。
目前 Angular 支持的內(nèi)建 validators 如下:
required - 設(shè)置表單控件值是非空的。
email - 設(shè)置表單控件值的格式是 email。
minlength - 設(shè)置表單控件值的最小長(zhǎng)度。
maxlength - 設(shè)置表單控件值的最大長(zhǎng)度。
pattern - 設(shè)置表單控件的值需匹配 pattern 對(duì)應(yīng)的模式。
示例
this.signupForm = this.fb.group({ userName: ['', [Validators.required, Validators.minLength(3)]], email: ['', [Validators.required, Validators.pattern('[a-z0-9._%+_]+@[a-z0-9.-]+')]] });
動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則
myControl.setValidators(Validators.required); myControl.setValidators([Validators.required, Validators.maxLength(6)]); myControl.clearValidators(); myControl.updateValueAndValidity();
自定義驗(yàn)證器
function myCustomValidator(c: AbstractControl): {[key: string]: boolean} | null { if(somethingIsWrong) { return { 'myvalidator': true}; } return null; }
自定義驗(yàn)證器 (支持參數(shù))
function myCustomValidator(param: any): ValidatorFn { return (c: AbstractControl): {[key: string]: boolean} | null { if(somethingIsWrong) { return { 'myvalidator': true}; } return null; } }
跨字段驗(yàn)證
emailMatcher
function emailMatcher(c: AbstractControl) { let emailControl = c.get('email'); let confirmControl = c.get('confirmEmail'); if (emailControl.pristine || confirmControl.pristine) { return null; } return emailControl.value === confirmControl.value ? null : { 'match': true }; }
emailGroup
ngOnInit(): void { this.signupForm = this.fb.group({ userName: ['', [Validators.required, Validators.minLength(6)]], emailGroup: this.fb.group({ email: ['', [Validators.required, Validators.email]], confirmEmail: ['', [Validators.required]], }, { validator: emailMatcher }) });
在介紹表單驗(yàn)證前,我們來(lái)看一下目前頁(yè)面的顯示效果:
表單驗(yàn)證
表單的內(nèi)建驗(yàn)證規(guī)則,前面章節(jié)已經(jīng)介紹過了,接下來(lái)我們來(lái)介紹在表單中如何 "動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則" 。
動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則
為了演示 "動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則" 的功能,我新增了兩個(gè)控件:
radio - 用于讓用戶設(shè)置是否開啟手機(jī)登錄。
tel - 當(dāng)用戶開啟手機(jī)登錄功能,用于讓用戶輸入手機(jī)號(hào)碼。
當(dāng)用戶開啟手機(jī)登錄功能,手機(jī)號(hào)碼對(duì)應(yīng)控件的驗(yàn)證規(guī)則,必須是必填且格式為合法的手機(jī)號(hào)碼。當(dāng)用戶不開啟手機(jī)登錄功能時(shí),手機(jī)號(hào)碼對(duì)應(yīng)控件將不是必填的。
新增 radio 控件
開啟手機(jī)登錄
新增 tel 控件
請(qǐng)輸入手機(jī)號(hào)碼 手機(jī)號(hào)碼格式不正確
動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則功能
ngOnInit(): void { ... this.signupForm.get('enableMobile').valueChanges .subscribe(value => this.checkMobile(value)); } checkMobile(enableMobile: string): void { const mobileControl = this.signupForm.get('mobile'); enableMobile === "1" ? mobileControl.setValidators([Validators.required, Validators.pattern('1(3|4|5|7|8)\\d{9}')]) : mobileControl.clearValidators(); mobileControl.updateValueAndValidity(); }
介紹完如何動(dòng)態(tài)調(diào)整驗(yàn)證規(guī)則,接下來(lái)我們來(lái)介紹如何 "自定義驗(yàn)證器"。
自定義驗(yàn)證器
為了演示 "自定義驗(yàn)證器" 的功能,我新增了一個(gè)控件:
number - 用于讓用戶設(shè)置是年齡信息。
當(dāng)讓用戶手動(dòng)輸入年齡信息時(shí),我們需要設(shè)置一個(gè)有效的年齡范圍,比如 (18 - 120)。此時(shí)我們就需要通過自定義驗(yàn)證器來(lái)實(shí)現(xiàn)上述功能。
新增 number 控件
輸入年齡不合法
自定義驗(yàn)證器模板
function myCustomValidator(c: AbstractControl): {[key: string]: boolean} | null { if(somethingIsWrong) { return { 'myvalidator': true}; } return null; }
新增 ageValidator 驗(yàn)證器
function ageValidator(c: AbstractControl): { [key: string]: any } | null { let age = c.value; if (age && (isNaN(age) || age < 20 || age > 120)) { return { 'range': true, min: 20, max: 120 }; } return null; }
使用 ageValidator 驗(yàn)證器
ngOnInit(): void { this.signupForm = this.fb.group({ // ... age: ['', ageValidator] }); }
我們的 ageValidator 自定義驗(yàn)證器,雖然已經(jīng)實(shí)現(xiàn)了。細(xì)心的讀者應(yīng)該會(huì)發(fā)現(xiàn),在 ageValidator 驗(yàn)證器內(nèi)部,我們寫死了年齡的邊界值 (最小值與最大值)。理想的情況下,應(yīng)該能夠讓用戶自行設(shè)定邊界值。因此接下來(lái),我們來(lái)優(yōu)化一下 ageValidator 驗(yàn)證器。
自定義驗(yàn)證器 (支持參數(shù))
自定義驗(yàn)證器模板 (支持參數(shù))
function myCustomValidator(param: any): ValidatorFn { return (c: AbstractControl): {[key: string]: boolean} | null { if(somethingIsWrong) { return { 'myvalidator': true}; } return null; } }
新增 ageRange 驗(yàn)證器工廠
function ageRange(min: number, max: number): ValidatorFn { return (c: AbstractControl): { [key: string]: any } | null => { let age = c.value; if (age && (isNaN(age) || age < min || age > max)) { return { 'range': true, min: min, max: max }; } return null; } }
使用 ageRange 驗(yàn)證器工廠
ngOnInit(): void { this.signupForm = this.fb.group({ // ... age: ['', ageRange(20, 120)] }); }
介紹完如何自定義驗(yàn)證器,接下來(lái)我們來(lái)介紹如何實(shí)現(xiàn) "跨字段驗(yàn)證" 的功能。
跨字段驗(yàn)證
在日常生活中,在注冊(cè)表單中,經(jīng)常要讓用戶再次輸入同樣的字段值,比如登錄密碼或郵箱地址的值。針對(duì)這種場(chǎng)景,我們就需要驗(yàn)證兩個(gè)控件的輸入值是否一致,這時(shí)我們就要引入跨字段驗(yàn)證的功能。
為了演示 "跨字段驗(yàn)證" 的功能,我新增了一個(gè)控件:
email - 用于讓用戶確認(rèn)輸入的郵箱地址
新增 email 控件
請(qǐng)輸入郵箱地址 兩次輸入的郵箱地址不一致
新增 emailMatcher
function emailMatcher(c: AbstractControl) { let emailControl = c.get('email'); let confirmControl = c.get('confirmEmail'); if (emailControl.pristine || confirmControl.pristine) { return null; } return emailControl.value === confirmControl.value ? null : { 'match': true }; }
新增 emailGroup
ngOnInit(): void { this.signupForm = this.fb.group({ userName: ['', [Validators.required, Validators.minLength(6)]], emailGroup: this.fb.group({ email: ['', [Validators.required, Validators.email]], confirmEmail: ['', [Validators.required]], }, { validator: emailMatcher }), // ... });
更新模板
請(qǐng)輸入郵箱地址 請(qǐng)輸入有效的郵箱地址
上面代碼中,有以下幾個(gè)問題需要注意:
Form Group 是可以嵌套使用的。
this.signupForm = this.fb.group({ userName: ['', [Validators.required, Validators.minLength(6)]], emailGroup: this.fb.group({ email: ['', [Validators.required, Validators.email]], confirmEmail: ['', [Validators.required]], }, { validator: emailMatcher })
我們通過 formGroupName="groupName" 語(yǔ)法來(lái)綁定內(nèi)嵌的 Form Group。
郵箱不匹配的信息是存在 emailGroup 對(duì)象的 errors 屬性中,而不是存在 confirmEmail 對(duì)象的 errors 屬性中。
兩次輸入的郵箱地址不一致
我有話說
怎么會(huì)監(jiān)聽表單值的變化?
Reactive Form
export class AppComponent { constructor(private fb: FormBuilder) { this.form = fb.group({ name: 'semlinker', age: 31 }); this.form.valueChanges.subscribe(data => { console.log('Form changes', data) }); } }Template-driven Form
模板
組件類
class AppComponent implements AfterViewInit { @ViewChild('myForm') form; ngAfterViewInit() { this.form.control.valueChanges .debounceTime(500) .subscribe(values => this.doSomething(values)); } }感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Angular如何實(shí)現(xiàn)Reactive Form表單驗(yàn)證”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
分享文章:Angular如何實(shí)現(xiàn)ReactiveForm表單驗(yàn)證
文章路徑:http://weahome.cn/article/pgpcjo.html