日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

Angular Reactive Forms -- Model-Driven Forms响应式表单

發布時間:2025/3/15 HTML 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Angular Reactive Forms -- Model-Driven Forms响应式表单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Angular 4.x 中有兩種表單:

  • Template-Driven Forms - 模板驅動式表單 (類似于 AngularJS 1.x 中的表單 )? 官方文檔:https://v2.angular.cn/docs/ts/latest/guide/forms.html

  • Reactive Forms (Model-Driven Forms) - 響應式表單? 官方文檔: https://v2.angular.cn/docs/ts/latest/guide/reactive-forms.html

Template-Driven Forms vs Reactive Forms

Template-Driven Forms (模板驅動表單) 的特點

  • 使用方便

  • 適用于簡單的場景

  • 通過 [(ngModel)] 實現數據雙向綁定

  • 最小化組件類的代碼

  • 不易于單元測試

  • 異步的,模板驅動表單會委托指令來創建它們的表單控件。 為了消除“檢查完后又變化了”的錯誤,這些指令需要消耗一個以上的變更檢測周期來構建整個控件樹。 這意味著在從組件類中操縱任何控件之前,我們都必須先等待一個節拍。

Reactive Forms (響應式表單) 的特點

  • 比較靈活

  • 適用于復雜的場景

  • 簡化了HTML模板的代碼,把驗證邏輯抽離到組件類中

  • 方便的跟蹤表單控件值的變化

  • 易于單元測試

  • 同步的 ,使用響應式表單,我們會在代碼中創建整個表單控件樹。 我們可以立即更新一個值或者深入到表單中的任意節點,因為所有的控件都始終是可用的。

使用?reactive forms 表單前,我們必須在?@NgModule?中導入?@angular/forms?庫中的?ReactiveFormsModule:

import { ReactiveFormsModule } from '@angular/forms';@NgModule({imports: [...,ReactiveFormsModule],declarations: [...],bootstrap: [...] }) export class AppModule {}

友情提示:若使用 reactive forms,則導入 ReactiveFormsModule;若使用 template-driven 表單,則導入 FormsModule。

FormControl 和 FormGroup

FormControl - 它是一個為單個表單控件提供支持的類,可用于跟蹤控件的值和驗證狀態,此外還提供了一系列公共API。

使用示例:

ngOnInit() {this.myControl = new FormControl('Semlinker'); }

FormGroup - 包含是一組 FormControl 實例,可用于跟蹤 FormControl 組的值和驗證狀態,此外也提供了一系列公共API。

使用示例:

ngOnInit() {this.myGroup = new FormGroup({name: new FormControl('Semlinker'),location: new FormControl('China, CN')}); }

現在我們已經創建了?FormControl?和?FormGroup?實例,接下來我們來看一下如何使用:

<form novalidate [formGroup]="myGroup">Name: <input type="text" formControlName="name">Location: <input type="text" formControlName="location"> </form>

注意事項:Template-Driven Forms 中介紹的?ngModel?和?name=""?屬性,已經被移除了。這是一件好事,讓我們的模板更簡潔。

上面示例中,我們必須使用?[formGroup]?綁定我們創建的?myGroup?對象,除此之外還要使用?formControlName?指令,綁定我們創建的?FormControl?控件。此時的表單結構如下:

FormGroup -> 'myGroup'FormControl -> 'name'FormControl -> 'location'

User interface

signup.interface.ts

export interface User {name: string;account: {email: string;confirm: string;} }

與之對應的表單結構如下:

FormGroup -> 'user'FormControl -> 'name'FormGroup -> 'account'FormControl -> 'email'FormControl -> 'confirm'

是的,我們可以創建嵌套的 FormGroup 集合!讓我們更新一下組件 (不包含初始數據):

import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms';@Component({...}) export class SignupFormComponent implements OnInit {user: FormGroup;ngOnInit() {this.user = new FormGroup({name: new FormControl(''),account: new FormGroup({email: new FormControl(''),confirm: new FormControl('')})});} }

如果我們想要設置初始數據,我們可以按照上述示例進行設置。通常情況下,我們通過服務端提供的 API 接口來獲取表單的初始信息。

綁定FormGroup模型

<form novalidate [formGroup]="user"><label><span>Full name</span><inputtype="text"placeholder="Your full name"formControlName="name"></label><div formGroupName="account"><label><span>Email address</span><inputtype="email"placeholder="Your email address"formControlName="email"></label><label><span>Confirm address</span><inputtype="email"placeholder="Confirm your email address"formControlName="confirm"></label></div><button type="submit">Sign up</button> </form>

現在?FormGroup?與?FormControl?對象與 DOM 結構的關聯信息如下:

// JavaScript APIs FormGroup -> 'user'FormControl -> 'name'FormGroup -> 'account'FormControl -> 'email'FormControl -> 'confirm'// DOM bindings formGroup -> 'user'formControlName -> 'name'formGroupName -> 'account'formControlName -> 'email'formControlName -> 'confirm'

當使用模板驅動的表單時,為了獲取?f.value?表單的值,我們需要先執行?#f="ngForm"?的操作。而對于使用響應式的表單,我們可以通過以下方式,方便的獲取表單的值:

{{ user.value | json }} // { name: '', account: { email: '', confirm: '' }}

Reactive submit

跟模板驅動的表單一樣,我們可以通過?ngSubmit?輸出屬性,處理表單的提交邏輯:

<form novalidate (ngSubmit)="onSubmit(user)" [formGroup]="user">... </form>

需要注意的是,我們使用?user?對象作為?onSubmit()?方法的參數,這使得我們可以獲取表單對象的相關信息,具體處理邏輯如下:

export class SignupFormComponent {user: FormGroup;onSubmit({ value, valid }: { value: User, valid: boolean }) {console.log(value, valid);} }

上面代碼中,我們使用?Object destructuring?(對象解構) 的方式,從user?對象中獲取?value?和?valid?屬性的值。其中?value的值,就是?user.value?的值。在實際應用中,我們是不需要傳遞?user?參數的:

export class SignupFormComponent {user: FormGroup;onSubmit() {console.log(this.user.value, this.user.valid);} }

表單的數據綁定方式和提交邏輯已經介紹完了,是該介紹表單實際應用中,一個重要的環節 — 表單驗證。

Reactive error validation

接下來我們來為表單添加驗證規則,首先我們需要從?@angular/forms?中導入?Validators。具體使用示例如下:

ngOnInit() {this.user = new FormGroup({name: new FormControl('', [Validators.required, Validators.minLength(2)]),account: new FormGroup({email: new FormControl('', Validators.required),confirm: new FormControl('', Validators.required)})}); }

通過以上示例,我們可以看出,如果表單控制包含多種驗證規則,可以使用數組聲明多種驗證規則。若只包含一種驗證規則,直接聲明就好。通過這種方式,我們就不需要在模板的輸入控件中添加?required?屬性。接下來我們來添加表單驗證失敗時,不允許進行表單提交功能:

<form novalidate (ngSubmit)="onSubmit(user)" [formGroup]="user">...<button type="submit" [disabled]="user.invalid">Sign up</button> </form>

那么問題來了,我們要如何獲取表單控件的驗證信息?我們可以使用模板驅動表單中介紹的方式,具體如下:

<form novalidate [formGroup]="user">{{ user.controls.name?.errors | json }} </form>

友情提示:?.prop 稱為安全導航操作符,用于告訴 Angular prop 的值可能不存在。

此外我們也可以使用?FormGroup?對象提供的 API,來獲取表單控件驗證的錯誤信息:

<form novalidate [formGroup]="user">{{ user.get('name').errors | json }} </form>

完整代碼:

import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { User } from './signup.interface'; @Component({selector: 'signup-form',template: `<form novalidate (ngSubmit)="onSubmit(user)" [formGroup]="user"><label><span>Full name</span><input type="text" placeholder="Your full name" formControlName="name"></label><div class="error" *ngIf="user.get('name').hasError('required') && user.get('name').touched">Name is required</div><div class="error" *ngIf="user.get('name').hasError('minlength') && user.get('name').touched">Minimum of 2 characters</div><div formGroupName="account"><label><span>Email address</span><input type="email" placeholder="Your email address" formControlName="email"></label><divclass="error"*ngIf="user.get('account').get('email').hasError('required') && user.get('account').get('email').touched">Email is required</div><label><span>Confirm address</span><input type="email" placeholder="Confirm your email address" formControlName="confirm"></label><divclass="error"*ngIf="user.get('account').get('confirm').hasError('required') && user.get('account').get('confirm').touched">Confirming email is required</div></div><button type="submit" [disabled]="user.invalid">Sign up</button></form>` }) export class SignupFormComponent implements OnInit {user: FormGroup;constructor() {}ngOnInit() {this.user = new FormGroup({name: new FormControl('', [Validators.required, Validators.minLength(2)]),account: new FormGroup({email: new FormControl('', Validators.required),confirm: new FormControl('', Validators.required)})});}onSubmit({ value, valid }: { value: User, valid: boolean }) {console.log(value, valid);} }

功能是實現了,但創建?FormGroup?對象的方式有點繁瑣,Angular 團隊也意識到這點,因此為我們提供?FormBuilder?,來簡化上面的操作。

Simplifying with FormBuilder

首先我們需要從?@angular/forms?中導入?FormBuilder:

import { FormBuilder, FormGroup, Validators } from '@angular/forms';export class SignupFormComponent implements OnInit {user: FormGroup;constructor(private fb: FormBuilder) {}... }

使用FormBuilder:

@Component({...}) export class SignupFormComponent implements OnInit {user: FormGroup;constructor(private fb: FormBuilder) {}ngOnInit() {this.user = this.fb.group({name: ['', [Validators.required, Validators.minLength(2)]],account: this.fb.group({email: ['', Validators.required],confirm: ['', Validators.required]})});}onSubmit({ value, valid }: { value: User, valid: boolean }) {console.log(value, valid);} }

?

轉自:https://segmentfault.com/a/1190000009041192

轉載于:https://www.cnblogs.com/xuepei/p/7922022.html

總結

以上是生活随笔為你收集整理的Angular Reactive Forms -- Model-Driven Forms响应式表单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色aa级片 | 欧美成年视频 | 亚洲成人黄色影院 | 精品国产二区三区 | 午夜伦理在线观看 | 国产15页 | 日本午夜小视频 | 国产一区二区波多野结衣 | 无套内谢少妇露脸 | 亚洲性欧美色 | 成人高清视频免费观看 | 国产成人av无码精品 | 亚洲精品自拍偷拍 | 男女扒开双腿猛进入爽爽免费 | 日韩 欧美 亚洲 国产 | 久久久久久久色 | 免费无遮挡无码永久视频 | 黄色一级影片 | 久久一线| 国产精品无码成人网站视频 | 国产无套精品 | 亚洲一区欧美一区 | 一区二区在线观看av | 黄色大片视频网站 | 99久久久久成人国产免费 | 欧美大色一区 | 婷婷在线一区 | 久草视频在线播放 | 久热这里只有精品在线 | 香蕉久久夜色精品国产使用方法 | 麻豆91精品| 中国 免费 av | 国产毛片精品国产一区二区三区 | 黄色国产毛片 | 亚洲综合一区二区三区 | 九色porny丨精品自拍视频 | 色啊色| 男人天堂视频在线 | 日韩精品美女 | 国产精品一线 | 欧美人成在线视频 | 国产经典自拍 | 天天色天天搞 | 看91| 奇米成人 | 国产视频xxxx | 天天干夜夜玩 | 91精品国产综合久久久蜜臀粉嫩 | 日韩精品极品视频在线观看免费 | 日本热久久 | 欧美资源网 | 中文幕无线码中文字蜜桃 | av网站在线免费看 | 亚洲另类图区 | 越南毛茸茸的少妇 | 天天干,夜夜操 | 日韩一级一区 | jizzjizz日本人| 91福利视频在线 | www.浪潮av.com | 欧美久久精品一级黑人c片 1000部多毛熟女毛茸茸 | 欧美极品少妇xxxxⅹ喷水 | 国产伦精品一区二区三区视频女 | 91禁国产网站 | 在线天堂av | 在线免费观看黄色片 | 中文字幕一区日韩 | 波多野结衣在线播放视频 | gogo亚洲国模私拍人体 | 久久久www成人免费毛片 | 免费看一级片 | 亚洲AV无码久久精品国产一区 | 在线观看黄色国产 | 虫族全黄h全肉污文 | 欧美一级片在线 | 脱裤吧导航 | 中文字幕乱码中文字幕 | 天堂在线v | 黄色三级三级三级三级 | 欧美操大逼 | jzz在线观看 | 色老头在线一区二区三区 | www.黄色在线 | 性色av浪潮 | 亚洲国产成人精品激情在线 | 少妇一级淫免费观看 | 免费在线观看黄 | 欧美精品五区 | 欧美日韩国产激情 | 日本精品视频 | 高清福利视频 | 亚洲中文字幕无码av | 亚洲色成人www永久在线观看 | 免费三级网站 | 亚洲性综合网 | 在线观看日韩精品 | 欧美一级视频免费 | 欧美性猛交xxxx偷拍洗澡 | 国产精品夜夜 |