欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular2表單自定義驗(yàn)證器的實(shí)現(xiàn)

 更新時間:2016年10月19日 16:51:04   投稿:mrr  
本文給大家介紹angular2表單自定義驗(yàn)證器的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧

本文主要給大家介紹如何判斷驗(yàn)證器的結(jié)果。在這里,我們就來看看怎樣實(shí)現(xiàn)一個自定義的驗(yàn)證器。

目標(biāo)

我們要實(shí)現(xiàn)一個驗(yàn)證手機(jī)號的驗(yàn)證器,使用的實(shí)例還是基于之前的文章里面的實(shí)例,也就是用戶信息輸入的表單頁面。我們在手機(jī)號的元素上添加一個驗(yàn)證手機(jī)號的驗(yàn)證器。然后,如果手機(jī)號驗(yàn)證失敗,就顯示一個錯誤,頁面如下:

這部分教程的代碼可以從github獲取:

git clone

https://github.com/Mavlarn/angular2-forms-tutorial

如果要運(yùn)行,進(jìn)入項(xiàng)目目錄,運(yùn)行下面的命令安裝依賴然后運(yùn)行測試服務(wù)器:

cd angular2-forms-tutorial
git checkout model-driven # 檢出該文所使用的tag
npm install
npm start

實(shí)現(xiàn)驗(yàn)證器

在Angular2中,實(shí)現(xiàn)一個驗(yàn)證器非常簡單,就是一個方法就可以,該方法的參數(shù)是一個FormControl,結(jié)果是一個錯誤對象或者null。用TypeScript接口表示,就是這樣:

interface Validator<T extends FormControl> {
(c:T): {[error: string]:any};
}

如果是對類似Java這樣的面向?qū)ο笳Z言比較了解的話,上面的接口定義就很容易理解。其中<T extends FormControl>是指這個方法中用到一個泛型T,它是一個繼承自FormControl的對象。(c:T): {[error: string]:any};這是一個lambda表達(dá)式的方法定義,參數(shù)c的類型為T,這個方法返回一個對象。

我們創(chuàng)建一個名為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}
}
}

在這個驗(yàn)證方法里,參數(shù)c的類型為FormControl,也就是表單控件,他有一個value屬性,存放當(dāng)前的值。我們使用正則表達(dá)式,來判斷這個值是否合法。如果不合法,就返回一個對象。
在之前的教程中,我們對驗(yàn)證器的驗(yàn)證結(jié)果是這樣獲得的:

<p *ngIf="userForm.controls.mobile?.errors?.required">必須輸入電話</p>

userForm.controls.mobile就是表單中手機(jī)號這個控件,required是required驗(yàn)證器對應(yīng)的key,當(dāng)required驗(yàn)證器驗(yàn)證失敗時,就會在errors里面添加一個值:

{
required: {valid: false}
}

所以,我們實(shí)現(xiàn)的自定義的驗(yàn)證器,也要把驗(yàn)證結(jié)果用驗(yàn)證器的名字作為key,放到errors里面,就是這樣:

{
validateMobile: {valid: false}
}

這樣,我們就能夠在頁面中用跟之前同樣的方式來獲得這個驗(yàn)證器的驗(yàn)證結(jié)果。

在模型驅(qū)動的表單里添加驗(yàn)證器

接下來,我們把我們實(shí)現(xiàn)的驗(yàn)證器添加到我們的表單里,先加到模型驅(qū)動的表單里:

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]]
});
...
}

上面的代碼省略了其他的部分,完整的代碼,請參考github。

在上面的代碼中,我們引入了之前實(shí)現(xiàn)的自定義的驗(yàn)證器,然后在表單控件創(chuàng)建代碼中,對mobile控件加了一個validateMobile。

這樣,我們在頁面上添加相應(yīng)的驗(yàn)證結(jié)果信息:

<p *ngIf="userForm.controls.mobile.errors?.validateMobile">電話號碼格式不正確</p>

這樣就完成了驗(yàn)證器,以及在頁面顯示驗(yàn)證結(jié)果,就這么簡單。

在模板驅(qū)動的表單里添加驗(yàn)證器

但是,如果我們的表單不是在組件里用模型驅(qū)動的方式創(chuàng)建的,而是在頁面上用html元素創(chuàng)建的,那么使用自定義的驗(yàn)證器就稍微麻煩一點(diǎn)。

在一個模板驅(qū)動的表單里,我們是這樣使用驗(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">電話長度必須為11</p>
<p *ngIf="mobile.errors?.required">必須輸入姓名</p>
</div>

也就是在input輸入元素的屬性中添加驗(yàn)證器。那么,我們要實(shí)現(xiàn)自己的驗(yàn)證器在表單里面使用,除了上面的驗(yàn)證器方法里面,還需要2件事情:

我們需要將這個驗(yàn)證器定義成一個指令Directive,這樣Angular在解析這段html的時候,會識別我們自定義的驗(yàn)證器指令。
我們還需要Angular的驗(yàn)證器調(diào)用我們的驗(yàn)證方法。
所以,在之前的mobile.validator.ts文件里,添加下面的指令定義:

@Directive({
selector: '[validateMobile][ngModel]'
})
export class MobileValidator {}

這段代碼很簡單,就是用@Directive標(biāo)簽定義了一個指令MobileValidator,它作用的元素是同時具有validateMobile和ngModel屬性的元素。這樣,我們就可以在手機(jī)號的元素上添加一個屬性,來使這個驗(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)用在這個指令上。

最后,我們再把這個新的指令,添加到AppModule的declarations里面,就可以在頁面上使用這個驗(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">電話長度必須為11</p>
<p *ngIf="mobile.errors?.required">必須輸入姓名</p>
<p *ngIf="mobile.errors?.validateMobile">電話號碼格式不正確</p>
</div>

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

相關(guān)文章

  • AngularJS 異步解決實(shí)現(xiàn)方法

    AngularJS 異步解決實(shí)現(xiàn)方法

    這篇文章主要介紹了AngularJS 異步解決實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法

    AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法

    今天小編就為大家分享一篇AngularJS中ng-options實(shí)現(xiàn)下拉列表的數(shù)據(jù)綁定方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 在Angular?中使用?Flex?布局的示例詳解

    在Angular?中使用?Flex?布局的示例詳解

    在本教程中,您使用?Flex?布局與?Angular?應(yīng)用程序,它允許您構(gòu)建一個布局,使用預(yù)配置的?Flexbox?CSS?樣式,而無需額外的樣式,對Angular使用?Flex?布局相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Angular17之Angular自定義指令詳解

    Angular17之Angular自定義指令詳解

    這篇文章主要介紹了Angular17之 Angular自定義指令的相關(guān)知識 ,需要的朋友可以參考下
    2018-01-01
  • angularJS提交表單(form)

    angularJS提交表單(form)

    這篇文章主要介紹了angularJS提交表單(form)的方法和示例,需要的朋友可以參考下
    2015-02-02
  • Angular中的Promise對象($q介紹)

    Angular中的Promise對象($q介紹)

    這篇文章主要介紹了Angular中的Promise對象($q介紹),本文講解了Promise模式、Q Promise的基本用法、AngularJs中的$q.defferd等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Angular.js中$apply()和$digest()的深入理解

    Angular.js中$apply()和$digest()的深入理解

    相信大家都知道$digest()和$apply()是AngularJS中的兩個核心并且有時候容易引人誤解的部分。我們需要深入理解這兩者是如何運(yùn)作的,從而才能理解AngularJS本身是如何運(yùn)作的。本文的目的就是介紹$digest()和$apply()是如何確確實(shí)實(shí)的對你有用的。下面來一起看看吧。
    2016-10-10
  • 詳解JavaScript的AngularJS框架中的表達(dá)式與指令

    詳解JavaScript的AngularJS框架中的表達(dá)式與指令

    這篇文章主要介紹了JavaScript的AngularJS框架中的表達(dá)式與指令,文中羅列了幾個常用的指令屬性加以說明,需要的朋友可以參考下
    2016-03-03
  • 詳解創(chuàng)建自定義的Angular Schematics

    詳解創(chuàng)建自定義的Angular Schematics

    本文對 Angular Schematics 進(jìn)行了介紹,并創(chuàng)建了一個用于創(chuàng)建自定義 Component 的 Schematics ,然后在 Angular 項(xiàng)目中以它為模板演練了通過 Schematics 添加自定義的 Component,感興趣的小伙伴們可以參考一下
    2018-06-06
  • AngularJS實(shí)現(xiàn)select的ng-options功能示例

    AngularJS實(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

最新評論