原文連接git
官方文檔並無說明
Template-driven Form
與Reactive Form
哪個更好。因爲以前開發過一個Ionic2
項目,使用的是Template-driven Form
,光是校驗就有一坨代碼,維護與開發簡直慘不忍睹,因此我的更加推薦使用Reactive Form
。github
使用Reactive Form
(同步),咱們會在代碼中建立整個表單 form control
樹。咱們能夠當即更新一個值或者深刻到表單中的任意節點,由於全部的 Form control
都始終是可用的。並且由於是同步,有利於單元測試。後端
在Template-driven Form
(異步)中,咱們是經過指令來建立 form control
的。咱們在操做一個Form control
以前,必需要經歷一個變化檢測週期。數組
FormControl是最小單位(C),FormGroup相似於一個由FormControl(C)組件的object
對象(G),FormArray(A)是一個由FormGroup(G)的Array
數組。它們之間能夠互相嵌套,以應對各式各樣的表單模型(Form Model)。bash
addForm: FormGroup;
constructor(public formBuilder: FormBuilder) {
this.orderForm = this.formBuilder.group({
name: ['', [Validators.required]],
description: ['', [Validators.required]],
other: this.formBuilder.group({
name: ['', [Validators.required]],
description: ['', [Validators.required]]
}),
items: this.formBuilder.array([
this.formBuilder.group({
name: ['', [Validators.required]],
description: ['', [Validators.required]],
}),
this.formBuilder.group({
name: ['', [Validators.required]],
description: ['', [Validators.required]],
}),
this.formBuilder.group({
name: ['', [Validators.required]],
description: ['', [Validators.required]],
})
])
});
}
複製代碼
經過this.addForm.value
獲取的值:服務器
{
name:'',
description:'',
other: {
name:'',
description:'',
},
items: [
{
name:'',
description:'',
},
{
name:'',
description:'',
},
{
name:'',
description:'',
}
]
}
複製代碼
它們三者之間的關係以下:antd
formGroup =
{
formControlName:formControl,
formControlName:formControl,
formControlName:formControl,
}
formArray = [
formGroup,
formGroup,
]= [
{
formControlName:formControl,
formControlName:formControl,
formControlName:formControl,
},
{
formControlName:formControl,
formControlName:formControl,
formControlName:formControl,
}
]
複製代碼
對於使用Reactive Form
時,動態增長formControl
也是很方便的。這種在,好比添加出差明細等狀況下很適合。 代碼示例參考數據結構
來自服務器就是數據模型(data model),而FormControl的結構就是表單模型(form model)。app
組件必須把數據模型中的英雄值複製到表單模型中。這裏隱含着兩個很是重要的點。異步
我的經驗:
formControl
。提交的時候不須要手動組裝數據。Template-driven Form
,須要手動組裝提交的數據,並且並無嚴格區分數據模型與表單模型,後期維護時,代碼很亂。any
,否則維護的時候,這酸爽!!!setValue
: 使用的時候須要每一個from control
都要設置值。不然,ERROR Error: Must supply a value for form control with name: 'xxxxx'
patchValue
: 相似打補丁,不須要每一個from control
都要設置值。