在Angular中,FormArray
是 ReactiveFormsModule
中的一个类,它允许你创建一个动态的表单数组。每个 FormArray
都包含一组 FormControl
实例。设置模板以匹配 FormArray
的值,需要使用 Angular 的模板语法来遍历 FormArray
中的每个控件,并相应地渲染它们。
FormControl
组织在一起。FormGroup
,它包含了一组 FormControl
,并且可以动态地添加或移除这些控件。FormArray
可以轻松创建动态表单,例如添加或删除表单字段。FormArray
与模板之间的双向数据绑定使得表单数据的更新和渲染非常高效。FormArray
中的每个控件应用验证规则。FormArray
通常与响应式表单一起使用,但它也可以在模板驱动表单中使用,尽管这种方式不太常见。假设我们有一个 FormArray
,它包含了一系列的电子邮件地址。我们希望在模板中渲染这些电子邮件地址,并允许用户添加新的地址。
// 在组件类中
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';
@Component({
selector: 'app-dynamic-form',
templateUrl: './dynamic-form.component.html',
})
export class DynamicFormComponent {
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
emails: this.fb.array([
this.fb.control('', [Validators.required, Validators.email])
])
});
}
get emailControls() {
return this.form.get('emails') as FormArray;
}
addEmail() {
this.emailControls.push(this.fb.control('', [Validators.required, Validators.email]));
}
}
<!-- 在模板文件中 -->
<form [formGroup]="form">
<div formArrayName="emails">
<div *ngFor="let emailControl of emailControls.controls; let i = index">
<input [formControlName]="i" placeholder="Email">
</div>
</div>
<button (click)="addEmail()">Add Email</button>
</form>
FormArray
中的数据没有正确绑定。原因: 可能是因为在模板中没有正确使用 formArrayName
指令,或者在组件类中没有正确获取 FormArray
。
解决方法: 确保在模板中使用 formArrayName
指令,并且在组件类中使用正确的方法获取 FormArray
实例。
FormControl
到 FormArray
后,视图没有更新。原因: Angular 的变更检测可能没有被触发。
解决方法: 在添加新的 FormControl
后,可以调用 ChangeDetectorRef
的 detectChanges
方法来手动触发变更检测。
import { ChangeDetectorRef } from '@angular/core';
constructor(private fb: FormBuilder, private cdr: ChangeDetectorRef) {}
addEmail() {
this.emailControls.push(this.fb.control('', [Validators.required, Validators.email]));
this.cdr.detectChanges();
}
请注意,以上代码和解释是基于 Angular 的常见用法,具体实现可能会根据你的应用需求和 Angular 版本有所不同。
领取专属 10元无门槛券
手把手带您无忧上云