## FormArray
追踪一组`FormControl`实例的值和验证状态。
`FormArray`聚合每一个子节点(`FormControl`)的值和验证状态到一个数组,通过逐步减少子节点状态计算它自身状态。例如:如果在`FormArray`中有一个子节点验证失败,那么最终整个数组验证也会失败。
`FormArray`同`FormControl`及`FormGroup`一同构成Angular表单3大基础功能模块。
### 使用方式
实例化`FormArray`,传入一个子节点数组作为第1个参数。
```javascript
const arr = new FormArray([
new FormControl('Nancy', Validators.minLength(2)),
new FormControl('Drew'),
]);
console.log(arr.value); // ['Nancy', 'Drew']
console.log(arr.status); // 'VALID'
```
也可以传入一个同步/异步验证数组(`Validators`/`AsyncValidators`)作为第2个参数。当需要验证至少一个子节点值和状态时,这些功能本身就是内在支持的。
### 添加或者移除控件
可以通过调用`FormArray`本身的`push`, `insert`或者`removeAt`方法来改变数组中的控件。这些方法能够保证在表单层级树中控件状态能够合理的被跟踪到。不建议直接修改`FormArray`中的`AbstractControl`实例,因为它会导致一些奇怪和无法预期的行为,例如打断Angular的值检测。
### Class
```javascript
class FormArray {
constructor(controls: AbstractControl[], validator?: ValidatorFn, asyncValidator?: AsyncValidatorFn)
controls : AbstractControl[]
at(index: number) : AbstractControl
push(control: AbstractControl) : void
insert(index: number, control: AbstractControl) : void
removeAt(index: number) : void
setControl(index: number, control: AbstractControl) : void
length : number
setValue(value: any[], {onlySelf}?: {onlySelf?: boolean}) : void
patchValue(value: any[], {onlySelf}?: {onlySelf?: boolean}) : void
reset(value?: any, {onlySelf}?: {onlySelf?: boolean}) : void
getRawValue() : any[]
}
```
### 属性
- controls : `AbstractControl[]` 包含的控件集合
- at(index: `number`) : `AbstractControl` 获取指定`index`对应`AbstractControl`
- push(control: `AbstractControl`) : `void` 插入一个新的`AbstractControl`到数组末尾。
- insert(index: `number`, control: `AbstractControl`) : `void` 在指定`index`处插入一个新的`AbstractControl`
- removeAt(index: `nubmer`) : `void` 移除指定`index`处的控件
- setControl(index: `number`, control: `AbstractControl`) : `void` 替换已存在的控件
- length : `number` 控件组的长度
- setValue(value: `any[]`, {onlySelf}?: {onlySelf?: `boolean`}) : void 设置`FormArray`的值。接收一个由满足控件签名的值组成的数组。
该方法会执行严格检查,即如果尝试传递一个不存在或被移除的控件,它会直接抛出错误。
```typescript
const arr = new FormArray([
new FormControl(),
new FormControl()
]);
console.log(arr.value); // [null, null]
arr.setValue(['Nancy', 'Drew']);
console.log(arr.value); // ['Nancy', 'Drew']
```
- patchValue(value: `any[]`, {onlySelf}?: {onlySelf?: `boolean`}) : `void` 填充`FormArray`数组的值,同样接收一个满足控件声明元素组成的数组件值,不同的是它会尽量把传入的参数匹配到正确控件。它可以接收上一级或者子集数组,而不会报错。
```typescript
const arr = new FormArray([
new FormControl(),
new FormControl()
]);
console.log(arr.value); // [null, null]
arr.patchValue(['Nancy']);
console.log(arr.value); // ['Nancy', null]
```
- reset(value?: `any`, {onlySelf?}: {onlySelf?: `boolean`}) : `void` 重置`FormArray`值。
You can also reset to a specific form state by passing in an array of states that matches the structure of the control. The state can be a standalone value or a form state object with both a value and a disabled status.
```typescript
this.arr.reset(['name', 'last name']);
console.log(this.arr.value); // ['name', 'last name']
```
或者:
```typescript
this.arr.reset([
{value: 'name', disabled: true},
'last'
]);
console.log(this.arr.value); // ['name', 'last name']
console.log(this.arr.get(0).status); // 'DISABLED'
```
- getRawValue() : `any[]` 获取`FormArray`数组的聚合值,包含任何被禁用的控件。
如果想获取所有值包括被禁用的状态,请使用此方法。否则,使用`value`属性是最好获取数组中值的方式。
- 说明
- angular 1.x
- ngModelController
- ngOptions
- ngModelOptions
- lifecycle
- directive
- angular 2
- @angular/forms
- 类
- AbstractControl
- AbstractControlDirective
- AbstractFormGroupDirective
- FormControl
- FormArray
- FormBuilder
- FormGroup
- NgControl
- 接口
- controlValueAccessor
- 指令
- DefaultValueAccessor
- Angular 2 生命周期
- OnInit
- DoCheck
- @angular/router
- 配置
- Routes
- 指令
- RouterOutlet
- RouterLink
- 接口
- ActivatedRoute
- UrlTree
- NavigationExtras
- ActivatedRouteSnapshot
- RouterStateSnapshot
- 类
- UrlSegment
- UrlSegmentGroup
- UrlSerializer
- DefaultUrlSerializer
- Router
- bug记得
- @angular/http
- 类
- Http
- Body
- Response
- ResponseOptions
- Header
- Request
- RequestOptions
- URLSearchParams
- @angular/core
- decorator
- Component-decorator
- animation
- DI
- linker
- TemplateRef
- ElementRef
- EmbeddedViewRef
- ViewRef
- ViewContainerRef
- Query
- ComponentFactory
- ComponentRef
- Renderer
- change_detection
- KeyValueDiffers
- IterableDiffers
- ChangeDetectorRef
- ChangeDetectionStrategy
- Zone
- ngZone
- @angular/common
- 指令
- NgTemplateOutlet
- QueryList
- bootstrap4
- card
- form
- 重点关注博客
- 学习过的文章
- 笔记
- Angular 2 双向绑定
- 将字符串解析成DOM
- rx相关
- operators
- combineLatest
- combineAll
- concat(All, Map, *MapTo)
- 背压(backpressure)
- js事件keycode对应表
- 装饰器
- 有用的代码摘录
- 日期操作
- 数量操作
- 字符操作
- rxjs问题
- 小示例
- h5面试准备
- react
- 开发遇到的问题