原文连接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
都要设置值。