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

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

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

本文主要給大家介紹如何判斷驗(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)站的支持!

相關(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ù)綁定方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 在Angular?中使用?Flex?布局的示例詳解

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

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

    Angular17之Angular自定義指令詳解

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

    angularJS提交表單(form)

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

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

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

    Angular.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á)式與指令

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

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

    本文對(duì) Angular Schematics 進(jìn)行了介紹,并創(chuàng)建了一個(gè)用于創(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

最新評(píng)論