[Angular] FormArray 眉眉角角
2019-06-30前端筆記
先前我對 FomrArray 一直有個誤解,就是以為在 Angular 的 Reactive Form 中,若表單裡的資料是 array 就要使用它;誰叫拿 angular 跟 form 、 array 三個關鍵字餵狗就會跑出它而事實上只要這樣寫就行了:
1 | constructor( |
若把 form.value
console.log 出來就是:
1 | { |
那 FormArray 的真正用途是什麼?主要是讓我們能「陣列式」管理表單的控制項與資料,例如以下的通訊錄表單:
1 | constructor( |
每位聯絡人姓名與電話為一組在 contacts 陣列裡的物件,form.value
的資料結構會是:
1 | { |
要在 html 中 render,用 formArrayName
連結 form 裡的 formArray 屬性名稱 "contacts"
,而 contacts 控制項作為 formArray ,其 controls
屬性為可供遍歷的 formGroup 陣列:
1 | <form [formGroup]="form"> |
注意 contacts 控制項並不是 JS array,Angular 定義的 FormArray 沒有像 splice()
等原生 JS 方法可用。
FormArray 操作
使用 push()
:
1 | (<FormArray>this.form.get('contacts')).push( |
使用 removeAt(idx)
:
1 | (<FormArray>this.form.get('contacts')).removeAt(idx); |
patchValue
一般 form 裡面的資料可以用 patchValue()
:
1 | this.form.patchValue({ |
對於 FormArray 資料另外用 setControl()
去覆蓋:
1 | this.form.setControl( |
清空 FormArray
要清空 FormArray 的元素,讓它長度為 0 時,用 removeAt()
去遞迴,寫成 function:
1 | clearFormArray = (formArray: FormArray) => { |
另一個比較暴力的做法:
1 | clearFormArray = (formArray: FormArray) => { |
副作用是若有對 formArray.valueChanges
的訂閱,將會丟失 reference 而出錯,不太推薦。
玩沙場
說那麼多不如來段可以玩的 code: