3.響應(yīng)式表單

如何創(chuàng)建一個數(shù)據(jù)模型,有定義在ngForms模塊中三個類組成,F(xiàn)ormControl,FormGroup,FormArray。
一.FromControl:構(gòu)成表單的基本單位,代表input元素,可以代表日歷,下拉選擇框,保存著元素當(dāng)前的值,校驗(yàn)狀態(tài),是否修改過
演示:如何創(chuàng)建FromControl?

表單.ts

 userName: FormControl = new FormControl('AAA'); /* 接收一個參數(shù),代表輸入框的初始值,naModel會為附著的元素input創(chuàng)建FormContrl*/

二、FormGroup:可以代表表單一部分,也可以用與代表整個表單,是多個Formcontrol的集合。
一個Formcontrol是無效的,那個FormGroup也是無效的。日期范圍字段。
演示;如何創(chuàng)建FormGroup?

formModel: FormGroup = new FormGroup({  // 創(chuàng)建的formGroup
    form: new FormControl(), // 日期范圍
    to: new FormControl()
  })

三、FormArray:FormGroup類似,有一個長度屬性。代表可以增長的字段集合。,有email,多個郵箱,可以用這個輸入任意一個。

emails: FormArray = new FormArray([  /*與FormGroup的formContrl不同的是,沒有key,托序號來訪問,第一個序號就是0,,*/
  new FormControl('aa@df.com'),
  new FormControl('BB@DD.COM')
])

介紹下指令
響應(yīng)式表單指令與模板指令完全不同,來自于
ReactiveFormComponent


image.png

注意:1.指令是form開頭,ng開頭的是模板式表單;2.響應(yīng)式form指令不可引用 #myForm="myform" .操作數(shù)據(jù)模型只能在代碼中操作,模板指令是在代碼中操作。
模板表單變響應(yīng)式,通常用formGroup代表整個表單。

一.表單.html(formGroup代表整個表單)

<form [formGroup]="forModel" (submit)="onSubmit()"> <!--表單處理方式變成了響應(yīng)式-->
<div>
  起始日期<input type="date">
  截止日期<input type="date">
</div>
<div>
  <ul>
    <li>
      <input type="text">
    </li>
  </ul>
  <button type="button">增加Email</button>
</div>
<div>
  <button type="submit">保存</button>
</div>
</form>

表單.ts

forModel: FormGroup = new FormGroup({})/*表示整個表單的數(shù)據(jù)*/
onSubmit() {
    console.log(this.forModel.value);
 }

二.formGroupName鏈接一個group:加數(shù)據(jù)

forModel: FormGroup = new FormGroup({  // 創(chuàng)建的formGroup
   dateRange: new FormGroup({
      form: new FormControl(), // 日期范圍
       to: new FormControl()
   })
 }) ;
 <div formGroupName="dateRange">
    起始日期<input type="date" formControlName="from">
    截止日期<input type="date" formControlName="to">
  </div>

效果:能把日期控件的值保存。([formGroup]="forModel"是后臺的屬性,formGroupName的值是一個字符串)

三、formControlName的值也是一個字符串,用在formGroupName指令內(nèi)
四、formAarryName
必須用在<form 的formGroup之內(nèi)。
步驟1:將模板的ul和控制器的emails的formAarry里的formControl綁定了

formModel: FormGroup = new FormGroup({  // 創(chuàng)建的formGroup
    dateRange: new FormGroup({
       form: new FormControl(), // 日期范圍
        to: new FormControl()
    }),
    emails: new FormArray([/*只有順序號,和ngFor一起使用*/
      new FormControl('aa.com'),
      new FormControl('bb.com')
    ])
  }) ;
<ul formArrayName="emails"> <!--和ts綁定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <li *ngFor="let e of  this.formModel.get('emails').controls; let i=index;"><!--需要當(dāng)前循環(huán)下標(biāo)-->
        <input type="text" [formControlName]="i"><!--和循環(huán)下標(biāo)綁定子一起-->
      </li>
    </ul>

步驟2:點(diǎn)擊按鈕向eamils數(shù)組添加元素,添加輸入框

addEmail() {
    const emails = this.formModel.get('emails') as FormArray;
    /*添加一個郵箱輸入框,需要拿到FormAarry,*/
    emails.push(new FormControl()); /*模板根據(jù)數(shù)組循環(huán),數(shù)組多一個元素,多一個輸入框*/
 }
<div>
    <ul formArrayName="emails"> <!--和ts綁定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <li *ngFor="let e of  this.formModel.get('emails').controls; let i=index;"><!--需要當(dāng)前循環(huán)下標(biāo)-->
        <input type="text" [formControlName]="i"><!--和循環(huán)下標(biāo)綁定子一起-->
      </li>
    </ul>
    <button type="button" (click)="addEmail()">增加Email</button>

    <button type="submit">保存</button>
  </div>

效果:就增加了郵箱輸入框,保存成功

五formControl
只能用在form外部


image.png

image.png

image.png
export class ReactiveFormComponent implements OnInit {

  formModel: FormGroup = new FormGroup({  // 創(chuàng)建的formGroup
    userName: new FormControl('aaa'),
    dateRange: new FormGroup({
       form: new FormControl(), // 日期范圍
        to: new FormControl()
    }),
    emails: new FormArray([/*只有順序號,和ngFor一起使用*/
      new FormControl('aa.com'),
      new FormControl('bb.com')
    ])
  }) ;

  /*emails: FormArray = new FormArray([  /!*與FormGroup的formContrl不同的是,沒有key,托序號來訪問,第一個序號就是0,,*!/
    new FormControl('aa@df.com'),
    new FormControl('BB@DD.COM')
  ]);*/


  constructor() { }
 onSubmit() {
    console.log(this.formModel.value);
 }
 addEmail() {
    const emails = this.formModel.get('emails') as FormArray;
    /*添加一個郵箱輸入框,需要拿到FormAarry,*/
    emails.push(new FormControl()); /*模板根據(jù)數(shù)組循環(huán),數(shù)組多一個元素,多一個輸入框*/
 }
  ngOnInit() {
  }

}

<form [formGroup]="formModel" (submit)="onSubmit()"> <!--表單處理方式變成了響應(yīng)式-->
 
 <input formControlName="userName">

  <div formGroupName="dateRange">
    起始日期<input type="date" formControlName="from">
    截止日期<input type="date" formControlName="to">
  </div>
  <div>
    <ul formArrayName="emails"> <!--和ts綁定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <li *ngFor="let e of  this.formModel.get('emails').controls; let i=index;"><!--需要當(dāng)前循環(huán)下標(biāo)-->
        <input type="text" [formControlName]="i"><!--和循環(huán)下標(biāo)綁定子一起-->
      </li>
    </ul>
    <button type="button" (click)="addEmail()">增加Email</button>

    <button type="submit">保存</button>
  </div>
</form>

image.png

image.png

注意:所有指令都是以form開頭的。以name結(jié)尾,不需要使用【】,只需要指定名字;只能用在【formGroup】指令之內(nèi)。
不以name結(jié)尾則用【】。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.簡單的H5表單 當(dāng)我們點(diǎn)擊注冊按鈕的時候會對表單進(jìn)行校驗(yàn) 2.Angular表單的分類 兩種表單的不同點(diǎn) 3....
    神豪VS勇士贏閱讀 856評論 0 1
  • 一.課程簡介 (注意:這里的AngularJS指的是2.0以下的版本) AngularJS的優(yōu)點(diǎn): 模板功能強(qiáng)大豐...
    壹點(diǎn)微塵閱讀 1,008評論 0 0
  • HTML表單 在HTML中,表單是 ... 之間元素的集合,它們允許訪問者輸入文本、選擇選項(xiàng)、操作對象等等,然后將...
    蘭山小亭閱讀 3,513評論 2 14
  • 看完剽悍晨讀的文章之后,腦海里想到的詞是“及時止損”這詞。我對股票一竅不通,但對這詞的印象特別深,就感覺這詞很貼切...
    豪小閱讀 359評論 0 0

友情鏈接更多精彩內(nèi)容