成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

angular學習之淺析響應式表單

本篇文章帶大家繼續angular的學習,了解一下angular中的響應式表單,介紹一下全局注冊響應式表單模塊、添加基礎表單控件的相關知識,希望對大家有所幫助!

angular學習之淺析響應式表單

響應式表單

Angular 提供了兩種不同的方法來通過表單處理用戶輸入:響應式表單模板驅動表單。【相關教程推薦:《angular教程》】

  • 響應式表單:提供對底層表單對象模型直接、顯式的訪問。它們與模板驅動表單相比,更加健壯。如果表單是你的應用程序的關鍵部分,或者你已經在使用響應式表單來構建應用,那就使用響應式表單。
  • 模板驅動表單:依賴模板中的指令來創建和操作底層的對象模型。它們對于向應用添加一個簡單的表單非常有用,比如電子郵件列表注冊表單。

這里只介紹響應式表單,模板驅動表單請參考官網:

https://angular.cn/guide/forms-overview#setup-in-template-driven-forms

全局注冊響應式表單模塊 ReactiveFormsModule

要使用響應式表單控件,就要從 @angular/forms 包中導入 ReactiveFormsModule,并把它添加到你的 NgModuleimports數組中。如下:app.module.ts

/***** app.module.ts *****/ import { ReactiveFormsModule } from '@angular/forms';  @NgModule({   imports: [     // other imports ...     ReactiveFormsModule   ], }) export class AppModule { }

添加基礎表單控件 FormControl

使用表單控件有三個步驟。

  • 在你的應用中注冊響應式表單模塊。該模塊聲明了一些你要用在響應式表單中的指令。

  • 生成一個新的 FormControl 實例,并把它保存在組件中。

  • 在模板中注冊這個 FormControl

要注冊一個表單控件,就要導入FormControl類并創建一個 FormControl的新實例,將其保存為類的屬性。如下:test.component.ts

/***** test.component.ts *****/ import { Component } from '@angular/core'; import { FormControl } from '@angular/forms';  @Component({   selector: 'app-name-editor',   templateUrl: './name-editor.component.html',   styleUrls: ['./name-editor.component.css'] }) export class TestComponent { 	// 可以在 FormControl 的構造函數設置初始值,這個例子中它是空字符串   name = new FormControl(''); }

然后在模板中注冊該控件,如下:test.component.html

<!-- test.component.html --> <label>   Name: <input type="text" [formControl]="name"> </label> <!-- input 中輸入的值變化的話,這里顯示的值也會跟著變化 --> <p>name: {{ name.value }}</p>

FormControl 的其它屬性和方法,參閱 API 參考手冊

https://angular.cn/api/forms/FormControl#formcontrol

把表單控件分組 FormGroup

就像FormControl 的實例能讓你控制單個輸入框所對應的控件一樣,FormGroup 的實例也能跟蹤一組 FormControl 實例(比如一個表單)的表單狀態。當創建 FormGroup 時,其中的每個控件都會根據其名字進行跟蹤。

看下例演示:test.component.tstest.component.html

import { Component } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'  @Component({   selector: 'app-test',   templateUrl: './test.component.html',   styleUrls: ['./test.component.css'] }) export class TestComponent implements OnInit {     constructor() {}      profileForm = new FormGroup({       firstName: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]),       lastName: new FormControl('', Validators.required),     }); 	 	onSubmit() { 		// 查看控件組各字段的值       console.log(this.profileForm.value)     } }
<!-- profileForm 這個 FormGroup 通過 FormGroup 指令綁定到了 form 元素,在該模型和表單中的輸入框之間創建了一個通訊層 --> <!-- FormGroup 指令還會監聽 form 元素發出的 submit 事件,并發出一個 ngSubmit 事件,讓你可以綁定一個回調函數。 --> <form [formGroup]="profileForm" (ngSubmit)="onSubmit()">     <label> <!-- 由 FormControlName 指令把每個輸入框和 FormGroup 中定義的表單控件 FormControl 綁定起來。這些表單控件會和相應的元素通訊 -->       First Name: <input type="text" formControlName="firstName">     </label>     <label>       Last Name: <input type="text" formControlName="lastName">     </label>     <button type="submit" [disabled]="!profileForm.valid">Submit</button>   </form>    <p>{{ profileForm.value }}</p>   <!-- 控件組的狀態: INVALID 或 VALID -->   <p>{{ profileForm.status }}</p>	   <!-- 控件組輸入的值是否為有效值: true 或 false-->   <p>{{ profileForm.valid }}</p>   <!-- 是否禁用: true 或 false-->   <p>{{ profileForm.disabled }}</p>

FormGroup 的其它屬性和方法,參閱 API 參考手冊

https://angular.cn/api/forms/FormGroup#formgroup

使用更簡單的 FormBuilder 服務生成控件實例

在響應式表單中,當需要與多個表單打交道時,手動創建多個表單控件實例會非常繁瑣。FormBuilder服務提供了一些便捷方法來生成表單控件。FormBuilder在幕后也使用同樣的方式來創建和返回這些實例,只是用起來更簡單。

FormBuilder 是一個可注入的服務提供者,它是由 ReactiveFormModule 提供的。只要把它添加到組件的構造函數中就可以注入這個依賴。

FormBuilder服務有三個方法:control()group()array()。這些方法都是工廠方法,用于在組件類中分別生成FormControlFormGroupFormArray

看下例演示:test.component.ts

import { Component } from '@angular/core'; // 1、導入 FormBuilder import { FormBuilder, Validators } from '@angular/forms';  @Component({   selector: 'app-test',   templateUrl: './test.component.html',   styleUrls: ['./test.component.css'] }) export class TestComponent { 	// 2、注入 FormBuilder 服務     constructor(private fb: FormBuilder) { }     ngOnInit() { }      profileForm = this.fb.group({       firstName: ['', [Validators.required, Validators.pattern('[a-zA-Z0-9]*')]],       lastName: ['', Validators.required],     });     // 相當于     // profileForm = new FormGroup({     //   firstName: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]),     //   lastName: new FormControl('', Validators.required),     // });      onSubmit() {       console.log(this.profileForm.value)       console.log(this.profileForm)     } }

對比可以發現,使用FormBuilder服務可以更方便地生成FormControlFormGroupFormArray,而不必每次都手動new一個新的實例出來。

表單驗證器 Validators

Validators類驗證器的完整API列表,參考API手冊

https://angular.cn/api/forms/Validators

驗證器(Validators)函數可以是同步函數,也可以是異步函數。

  • 同步驗證器:這些同步函數接受一個控件實例,然后返回一組驗證錯誤或 null。你可以在實例化一個 FormControl 時把它作為構造函數的第二個參數傳進去。
  • 異步驗證器 :這些異步函數接受一個控件實例并返回一個 PromiseObservable,它稍后會發出一組驗證錯誤或 null。在實例化 FormControl 時,可以把它們作為第三個參數傳入。

出于性能方面的考慮,只有在所有同步驗證器都通過之后,Angular 才會運行異步驗證器。當每一個異步驗證器都執行完之后,才會設置這些驗證錯誤。

驗證器Validators類的API

https://angular.cn/api/forms/Validators

class Validators {   static min(min: number): ValidatorFn		// 允許輸入的最小數值   static max(max: number): ValidatorFn		// 最大數值   static required(control: AbstractControl): ValidationErrors | null	// 是否必填   static requiredTrue(control: AbstractControl): ValidationErrors | null   static email(control: AbstractControl): ValidationErrors | null	// 是否為郵箱格式   static minLength(minLength: number): ValidatorFn		// 最小長度   static maxLength(maxLength: number): ValidatorFn		// 最大長度   static pattern(pattern: string | RegExp): ValidatorFn	// 正則匹配   static nullValidator(control: AbstractControl): ValidationErrors | null	// 什么也不做   static compose(validators: ValidatorFn[]): ValidatorFn | null   static composeAsync(validators: AsyncValidatorFn[]): AsyncValidatorFn | null }

內置驗證器函數

要使用內置驗證器,可以在實例化FormControl控件的時候添加

import { Validators } from '@angular/forms'; ... ngOnInit(): void {   this.heroForm = new FormGroup({   // 實例化 FormControl 控件     name: new FormControl(this.hero.name, [       Validators.required,	// 驗證,必填       Validators.minLength(4),	// 長度不小于4       forbiddenNameValidator(/bob/i) // 自定義驗證器     ]),     alterEgo: new FormControl(this.hero.alterEgo),     power: new FormControl(this.hero.power, Validators.required)   }); } get name() { return this.heroForm.get('name'); }  get power() { return this.heroForm.get('power'); }

自定義驗證器

自定義驗證器的內容請參考API手冊

https://angular.cn/guide/form-validation

有時候內置的驗證器并不能很好的滿足需求,比如,我們需要對一個表單進行驗證,要求輸入的值只能為某一個數組中的值,而這個數組中的值是隨程序運行實時改變的,這個時候內置的驗證器就無法滿足這個需求,需要創建自定義驗證器。

  • 在響應式表單中添加自定義驗證器。在上面內置驗證器一節中有一個forbiddenNameValidator函數如下:

    import { Validators } from '@angular/forms'; ... ngOnInit(): void {   this.heroForm = new FormGroup({     name: new FormControl(this.hero.name, [       Validators.required,       Validators.minLength(4),       // 1、添加自定義驗證器       forbiddenNameValidator(/bob/i)     ])   }); } // 2、實現自定義驗證器,功能為禁止輸入帶有 bob 字符串的值 export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {   return (control: AbstractControl): ValidationErrors | null => {     const forbidden = nameRe.test(control.value);     // 3、在值有效時返回 null,或無效時返回驗證錯誤對象     return forbidden ? {forbiddenName: {value: control.value}} : null;   }; }

    驗證器在值有效時返回 null,或無效時返回驗證錯誤對象。 驗證錯誤對象通常有一個名為驗證秘鑰(forbiddenName)的屬性。其值為一個任意詞典,你可以用來插入錯誤信息({name})。

  • 在模板驅動表單中添加自定義驗證器。要為模板添加一個指令,該指令包含了 validator 函數。同時,該指令需要把自己注冊成為NG_VALIDATORS的提供者。如下所示:

    // 1、導入相關類 import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms'; import { Input } from '@angular/core'  @Directive({   selector: '[appForbiddenName]',   // 2、注冊成為 NG_VALIDATORS 令牌的提供者   providers: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}] }) export class ForbiddenValidatorDirective implements Validator {   @Input('appForbiddenName') forbiddenName = '';   // 3、實現 validator 接口,即實現 validate 函數   validate(control: AbstractControl): ValidationErrors | null {   	// 在值有效時返回 null,或無效時返回驗證錯誤對象     return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, 'i'))(control)                               : null;   } } // 4、自定義驗證函數 export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {   return (control: AbstractControl): ValidationErrors | null => {     const forbidden = nameRe.test(control.value);     // 3、在值有效時返回 null,或無效時返回驗證錯誤對象     return forbidden ? {forbiddenName: {value: control.value}} : null;   }; }

    注意,自定義驗證指令是用 useExisting 而不是 useClass 來實例化的。如果用useClass來代替 useExisting,就會注冊一個新的類實例,而它是沒有forbiddenName 的。

    <input type="text" required appForbiddenName="bob" [(ngModel)]="hero.name">

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
韩国亚洲精品a在线无码| Z Z〇Z〇另类女人ZOZ〇| 天堂いっしょにしよ在线| 啊轻点灬大JI巴太粗熟妇| 国产精品自在拍首页视频8| 亚洲日韩乱码中文无码蜜桃臀| 狼友AV永久网站在线观看| 99久久精品国产综合| 公园小树中老年交易图片| 亚洲精品卡一卡三卡四卡乱码| 久久天天躁狠狠躁夜夜AⅤ| 天天躁夜夜躁天干天干2020| 97久章草在线视频播放| 朋友人妻少妇精品系列| 麻花传媒剧国产MV在线看| 久久国国产免费999| 娇小萝被两个黑人用半米长| 国产熟女老妇300部MP4| 国产成人综合一区人人| 大香伊蕉在人线国产69| 宝宝两根就哭男男是不是太早了 | 麻豆AV一区二区三区| 机长脔到她哭H粗话H动漫| 国产欧美久久久精品影院| 国产福利一区二区三区在线观看| 国内精品一线二线三线黄| 国精品无码一区二区三区在线蜜臀| 国产成人高清精品亚洲| 国产成人综合日韩精品无码| 极品尤物一区二区三区| 男人吃奶摸下挵进去好爽| 麻豆精品一区二正一三区| 日本丰满的人妻HD高清在线| 人人澡人人透人人爽| 人妻激情乱人伦视频| 日本XXX色视频在线观看| 无码专区 丝袜美腿 制服师生| 四川少妇BBW搡BBBB槡BBBB| 丝袜美女人体艺术| 亚洲人成电影网站色MP4| 亚洲午夜无码毛片Av| 野花高清中文免费观看视频 | 日产精品卡二卡三卡四妈妈的朋友| 麻豆av无码人妻一区二区三区| 日本高清乱理伦片中文字幕| 亚洲AV永久无码精品无码少妇| 亚洲乱亚洲乱少妇无码99P| 亚洲欧美日韩二三区在线| JAPANESE中国丰满少妇| 变态拳头交视频一区二区| 成熟老太毛茸茸BBWBBW| 公侵犯玩弄漂亮人妻优| 精品香蕉99久久久久成人网站| 久久久久久AV无码免费网站下载| 久久亚洲国产精品成人AV秋霞| 免费高清视频 大片| 女口述第一次放进去的感受| 人摸人人人澡人人超碰| 日产无码精品一区二区三区| 亚洲精品色午夜无码专区日韩| 凹厕所XXXXBBBB偷拍视频| 大战丰满人妻性色AV偷偷| 久久AV高清无码| 免费人妻AⅤ无码专区久久综合| 欧美激情视频一区二区三区免费| 日本人妻丰满熟妇久久久久久不卡 | 少妇呻吟翘臀后进爆白浆| 小蜜被两老头吸奶头在线观看| 亚洲成AV人片天堂网无码| 一炕四女被窝交换啪啪| JAPANESE护士高潮SEX| 黑人巨大BBWBBW| 麻豆AⅤ精品无码一区二区| 无码AV高潮喷水无码专区线| 亚洲精品NV久久久久久久久久 | 久久久久久精品一区二区三区日本 | 他的白月光H1∨1笔趣阁| 亚洲VA韩国VA欧美VA| 中国女人大白屁股ASS| 日日摸夜夜添夜夜添高潮喷水| 国产精品-区区久久久狼| 23部禽女乱小说内| 亚洲国产成人VA在线观看| 亚洲日韩精品无码一区二区三区 | 乱人伦人成品精国产在线| 小婷又软又嫩又紧水又多的视频| 办公室被吃奶好爽在线观看 | 一边捏奶头一边高潮视频| 国产人无码A在线西瓜影音| 日韩精品无码观看视频免费| 中文字幕乱码人妻无码久久| 粗壮挺进邻居人妻无码| 男人J进女人屁网站免费| 亚洲色成人网站WWW永久四虎| 国产精品原创AV片国产日韩| 日韩一卡2卡3卡4卡| A级毛片免费全部播放| 国产精品亚洲日韩欧美色窝窝色欲| 前夫6天要了我25次| 中文AV无码人妻一区二区三区| 公交车里抓着摇曳的手环诗情| 精品v内射66偷窥| 婷婷综合缴情亚洲狠狠| 一本久道久久综合狠狠躁AV| 粗长巨龙挤进新婚少妇| 欧美国产日本高清不卡| 中文字幕精品亚洲无线码二区 | 亚洲色成人中文字幕网站| 国精产品一线二线三线| 无人区一码一码二码三码区别| 中文字幕一区二区精品区| 国产成人无码AV在线播放DVD| 老熟妇XXXⅩHD老熟女| 四虎亚洲精品成人A在线观看 | 欧美肉体裸交做爰XXXⅩ| 亚洲 欧美 卡通 另类 小说| AV无码AV不卡一区二区| 黑人精品一区二区| 香港三日本三级少妇三级2021| 99精产国品一二三产区区别在线 | 日本19禁啪啪吃奶大尺度| 99精品无人区乱码在线观看 | 黑人双人RAPPER剧情介绍| 亚洲 欧美 中文 日韩AⅤ手机| 国产偷国产偷亚洲清高孕妇| 性欧美丰满熟妇XXXX性| 国产偷久久久精品专区| 羞涩的丰满人妻40P| 国产亚洲日韩AV在线播放不卡 | 推高她的裙子挺身而入| 国产成人一卡2卡3卡4卡| 婷婷国产三区四区| 国产韩国精品一区二区三区| 无码精品人妻一区二区三区免费看 | 黑人巨根后入娇小女孩| 亚洲精品无码伊人久久| 久久国产中文娱乐网| 又大又长粗又爽又黄少妇毛片| 国产精品亚洲专区无码导航| 无码人妻少妇久久中文字幕蜜桃 | 亚洲日韩精品一区二区三区无码| 久久精品国产色蜜蜜麻豆| 野花免费观看高清电视| 美国少归BVBV| 9久9久女女免费视频精品| 热久久99这里有精品综合久久| 成人3D动漫一区二区三区| 毛很浓密超多黑毛的少妇| 中国鲜肉GAY高中XX禁18网| 女人被男人吃奶到高潮| 宝贝腿开大点我添添公视频免费| 日日躁夜夜躁狠狠躁| 国产精品无码一区二区在线| 亚洲AV之男人的天堂网站| 久久九九兔免费精品6| 亚洲AV无码成人精品区一本二本| 国产777涩在线 | 美洲| 无码日韩精品一区二区人妻| 和老婆一起玩的双人| 一区二区三区乱码在线 | 中文 | 1000部又爽又黄无遮挡的视频| 精品无人乱码高清在线观看| 一本大道东京热无码视频| 男吃奶玩乳尖高潮视频午夜| 成人毛片女人18女人免费| 亚洲精品无码AV中文字幕| 精品3D动画肉动漫在线无码| 久久丫线这里只精品| 亚洲AV无码一区二区二三区软件 | 久久久久99精品成人片试看 | 亚洲成AV人最新无码| 巨大黑人XXXXX高潮后处理| JEALOUSVUE成熟MON| 精品久久久无码中字| 无码无套少妇毛多69XXX| 精品国产黑色丝袜高跟鞋| 亚洲AV无码精品色午夜| 久久久久无码国产精品不卡| 亚洲日韩VA无码中文字幕 | 国产亚洲欧美精品一区| 无码人妻丰满熟妇奶水区毛片| 精产国品一二三产品区别大吗 | 性生生活30分钟免费| 老外免费CSGO交易网站有哪些| 草草浮力院禁止18进入| 日本边添边摸边做边爱边| 国产成人无码一区二区三区| 亚洲色偷拍区另类无码专区| 久久99国产精品尤物| 亚洲精品无码成人AV电影网| 年轻漂亮的女邻居观看在线视频| 97AV麻豆蜜桃一区二区| 熟妇性MATURETUBE另类| 久久国产精品久久久久久| 波多野AV一区二区无码| 亚洲AV伊人久久青青草原视色 | 日本高清XXXXXXXXXX| 狠狠色噜噜狠狠狠狠蜜桃| CHINSEFUCKGAY无套| 亚洲AV成人影视综合网|