模板式表单
适用于简单表单。
常用指令
1. NgForm
会创建一个 FormGroup 的实例.
- 默认情况下 Angular 会给 form 标签添加
NgForm指令, 来接管 form 处理, 例如即使添加action="/postForm", 点击提交页面也不会跳转. - 不想让 Angular 接管表单的话要在 form 标签上添加
NgNoForm指令. NgForm会隐式创建一个FormGroup类, 来存储表单数据.NgForm可以用于其他标签(不限于 form 标签), 例如<div NgForm></div>, 会被渲染为 form 表单.- 在 form 标签上添加本地模板指令
#myForm="ngForm", 可以在模板中访问NgForm创建的对象. NgForm下提交表单会触发ngSubmit事件, 将(ngSubmit)="onSubmit(myForm.value)"添加到 form 标签上, 可以在onSubmit方法中提交表单.
2. ngModel
会创建一个 FormControl 的实例.
为 NgForm 下的 input 标签添加 ngModel 指令(注意: 此处不同于数据双向绑定 [(ngModel)]), 然后给 input 标签添加 name 属性, 可以把 input 的值绑定到 ngForm 对象上.
例如: <input type="text" #username="ngModel" ngModel name="username">.
3. NgModelGroup
会创建一个 FormGroup 的实例.
用于 NgModel 分组.
响应式表单
适用于复杂表单。
- 区分模板式表单和响应式表单: 响应式表单 HTML 模板里是
form*开头的指令; 模板式表单 HTML 模板里是ngModel, ngModelGroup. - 响应式表单不可以通过
#myForm这种模板本地变量引用. - 第一步创建一个数据模型, 第二步使用指令将 HTML 模板元素链接到创建的数据模型.
类名
1. FormControl
是构成响应式表单的基本单位; 保存着与其关联 HTML 元素当前的值, 校验状态, 以及是否被点击过.
1 | username: FormControl = new FormControl('aaa'); |
2. FormGroup
既可以代表一个表单的一部分, 也可以代表整个表单, 是多个 FormControl 的集合.
1 | formModel: FormGroup = new FormGroup({ |
3. FormArray
- 类似于 FormGroup, 多了 length 属性.
- 相较于 FormGroup, FormArray 通常用来代表一个可以增长的字段集合.
- 无 key, 只能通过索引获取每个元素.
1 | emails: FormArray = new FormArray([new FormControl('a@a.com'), new FormControl('a@b.com')]); |
指令
- formControl(formControlName)
- formGroup(formGroupName)
- (formArrayName)
说明:
- 给 form 标签添加
[formGroup]="formModel"指令(其中formModel为一个FormGroup类型的数据模型), 会将表单变成响应式表单. - 给 form 标签添加
(ngSubmit)="onSubmit()"指令, 可以在onSubmit方法中提交表单. - 给 formGroup 分组标签添加
formGroupName="dateRange". formControlName指令必须声明在formGroup指令范围之内, 可以链接模板与数据模型, 如:formControlName="from".formArrayName指令必须声明在formGroup指令范围之内.formControl指令不能声明在formGroup指令范围之内, 可以用formControlName指令.
示例代码:
1 | <form [formGroup]="formModel" (submit)="onSubmit()"> |
1 | formModel: FormGroup = new FormGroup({ |