前面我们了解了下响应式表单的基本控件FormControl
,它相当于表单的Input,是构成表单的基本控件。但假设我们的表单是有很多的字段,那挨个去管理FormControl
控件会变得很麻烦,我们可以使用FormGroup
来集中管理一组FormControl
。
FormGroup
的实例可以跟踪一组FormControl
实例,当创建一个FormGroup
时,其中的每个控件都可以根据名字来进行跟踪。
创建FormGroup的实例
还是以登录页表单为例,在组件类中创建loginForm
的FormGroup
实例,并拥有name
和password
两个表单控件:
1 | import {Component, OnInit} from '@angular/core'; |
然后关联这个FormGroup
到视图中:
1 | <form class="login-form" [formGroup]="loginForm" (ngSubmit)="submit()"> |
formGroup
和formControlName
是响应式表单模块提供的指令。当我们用formGroup
来管理一组表单控件的时候,使用formControlName
将控件和表单绑定是一个很方便的操作。
fromGroup的更新数据方法:setValue和patchValue
前面说FormControl
的时候就看到过setValue
和patchValue
,他们在FormGroup
层级上的作用是不一样的。
setValue
setValue
是严格遵循表单结构,并整体替换控件的值,比如我们想设置下表单的值,那么我们可以这样做:
1 | this.loginForm.setValue({ |
需要严格遵循结构的,少一个都不行,比如:
1 | this.loginForm.setValue({ |
这样就不行,会报错。
所以说严格遵循,就是不能多不能少。
patchValue
patchValue
方法可以用对象中所定义的任何属性为表单模型进行修补式的赋值。它只会讲匹配的属性进行赋值,会忽略不匹配的。
比如针对性的赋值可以这样写:
1 | this.loginForm.patchValue({ |
运行良好,无副作用。
使用FormBuilder服务
我们处理表单的过程中,有时候会遇到很复杂的表单,手动去创建多个表单控件就会变得非常不开心。Angular提供了FormBuilder
服务来方便的生成表单控件,使用起来更方便简单。
我们用FormBuilder
来重写上面的loginForm
表单。
1 | import {Component, OnInit} from '@angular/core'; |
使用FormBuilder
生成的表单和前面手写的使用起来都没啥区别。
我记得前面好长一段时间我竟然不知道使用FormBuilder
的时候如何去设置某个表单控件为禁用,就不得不在FormBuilder
里面对特别控件写new FormControl
。也是醉了。
那么我们怎么去在FormBuilder
里面设置某个控件为禁用呢?很简单:
1 | this.loginForm = this._fb.group({ |
重置表单和获取表单的值
重置表单和获取表单的值算是很常见的场景了,我们可以单独的去重置某个表单项。
首先,我们从FormGroup
中获取单个的表单控件的方式有两种:
1 | const name = this.registerForm.controls['name']; |
或者:
1 | const name = this.registerForm.get('name'); |
然后可以去重置这个表单项:
1 | name.reset(); |
获取这个表单项的值:
1 | const value = name.value; |
为了方便,我们直接在FormGroup
上来操作。
重置:
1 | this.registerForm.reset(); |
重置了FormGroup
上的所有表单控件。
获取值:
1 | const values = this.registerForm.getRawValue(); |
getRawValue
获得的是FormGroup
上结构的所有属性的值,具体访问的时候可以使用key
进行访问:
1 | const nameValue = values.name; |