響應式表單提供了一種模型驅動的方式來處理表單輸入,其中的值會隨時間而變化。本文會向你展示如何建立和更新基本的表單控制元件,接下來還會在一個表單組中使用多個控制元件,驗證表單的值,以及建立動態表單,也就是在執行期新增或移除控制元件。
這裡的 require 建儀是寫在 formGroup 裡面去作理管,才可方便的在 js 中看到何為必填值。
透過下列這段 checked form 是否有尚未寫好的值,或是沒有通過的 validations。
可把欄位 disable 和 enable,但是特別注意 disable()
的值,如果直接用 this.form.value
會拿不到值
如果想要拿到 disable()
的值,需要用 getRawValue()
來取得到已被 disable()
的值
How do I restrict an input to only accept numbers?
How do I restrict an input to only accept numbers?
form 的表單很大的情況,希望可以有結構化的去管理資料,可以 nest formGroup
的方式,方便一目了然的去抓到資料
先前我對 FomrArray 一直有個誤解,就是以為在 Angular 的 Reactive Form 中,若表單裡的資料是 array 就要使用它;誰叫拿 angular 跟 form 、 array 三個關鍵字餵狗就會跑出它而事實上只要這樣寫就行了:
若把 form.value
console.log 出來就是:
那 FormArray 的真正用途是什麼?主要是讓我們能「陣列式」管理表單的控制項與資料,例如以下的通訊錄表單:
每位聯絡人姓名與電話為一組在 contacts 陣列裡的物件,form.value
的資料結構會是:
要在 html 中 render,用 formArrayName
連結 form 裡的 formArray 屬性名稱 "contacts"
,而 contacts 控制項作為 formArray ,其 controls
屬性為可供遍歷的 formGroup 陣列:
注意 contacts 控制項並不是 JS array,Angular 定義的 FormArray 沒有像 splice()
等原生 JS 方法可用。
使用 push()
:
使用 removeAt(idx)
:
一般 form 裡面的資料可以用 patchValue()
:
對於 FormArray 資料另外用 setControl()
去覆蓋:
要清空 FormArray 的元素,讓它長度為 0 時,用 removeAt()
去遞迴,寫成 function:
另一個比較暴力的做法:
副作用是若有對 formArray.valueChanges
的訂閱,將會丟失 reference 而出錯,不太推薦。
下列是 angular 在 formGroup 中提供的 validations 的方式,當然也可以自己去寫 customer 的 validation function
setErrors 如果是 null 的情況下,會把原本的 required 的設定也都拿掉,所以要特別小心
NOTE 如果是在另一個 component 中要去 control 另一個 form 給它 setErrors 的話可以加上面這一段,這樣子才可以正常的設定 error
Angular reactive forms set and clear validators
在操作 js 的時候,需要有一個特定的 error style 可以用 setErrors
來設定 boolean
讓 template
來使用
清除不需要 error style 可以把此方法,我原本設用的 error 移除
Angular: Custom Async Validators
Cross Field Validation Using Angular Reactive Forms - Offering Solutions Software
有時候的情境會需要特別用 js 來觸發驗證,就可以用此方式來確認。
有些情況下,submit form 之後,要在清除 form 的資料,可用下列的方式去作 clear 的動作。
reset() vs resetForm() ??
這兩個有什麼差別呢?實際上在專案遇到的情況。如果使用 form 的 submit 是用
ngSubmit
的話,會需要用 resetForm 來清掉原本的值,不然 require 的錯誤會跑出來。如果你用 click button 的方式,可以直接用 reset 就可以,require 的錯誤不會跑出來
使用 setValue 和 patchValue 其實是一樣的,主要都是會去觸發,updateValueAndValidity
這一個 function
不管是 formGroup 和 formControl 都可以用 subscribe 去作訂閱
如果是一個 onlySelf 的 setValue 的話,那就不會改變 _parent
的 value。
目前看到官方文件是寫 onlySelf
預設值為 false ,但是有些文章是 true ,這個就有待確認了,可能改過版了。
另外一個常用到的就是 emitEvent
,如果希望在 setValue 的時候不要去觸發 valueChange 的話,就可以用
比較一下這兩個 option 的用法
如果你看到這個 error msg 的話
Angular reactive Form error: Must supply a value for form control with name
表示你在更新 form 表單的資料,是用 setValue ,但是沒有完整的更新所有的值,如果你只是要更新部分的資料的話,可以用 patchValue()