FormArray は FormGroup のバリアントです。主な違いは、データが配列としてシリアル化されることです (FormGroup の場合はオブジェクトとしてシリアル化されるのとは対照的です)。これは、動的フォームなど、グループ内に存在するコントロールの数がわからない場合に特に便利です。
簡単な例で説明してみましょう。たとえば、顧客のピザの注文を記録するフォームがあるとします。そして、ボタンを配置して、特別なリクエストを追加および削除できるようにします。コンポーネントの html 部分は次のとおりです。
<section>
<p>Any special requests?</p>
<ul formArrayName="specialRequests">
<li *ngFor="let item of orderForm.controls.specialRequests.controls; let i = index">
<input type="text" formControlName="{{i}}">
<button type="button" title="Remove Request" (click)="onRemoveSpecialRequest(i)">Remove</button>
</li>
</ul>
<button type="button" (click)="onAddSpecialRequest()">
Add a Request
</button>
</section>
特別なリクエストを定義して処理するコンポーネント クラスは次のとおりです。
constructor () {
this.orderForm = new FormGroup({
firstName: new FormControl('Nancy', Validators.minLength(2)),
lastName: new FormControl('Drew'),
specialRequests: new FormArray([
new FormControl(null)
])
});
}
onSubmitForm () {
console.log(this.orderForm.value);
}
onAddSpecialRequest () {
this.orderForm.controls
.specialRequests.push(new FormControl(null));
}
onRemoveSpecialRequest (index) {
this.orderForm.controls['specialRequests'].removeAt(index);
}
FormArray は、FormGroup の「addControl」、「removeControl」、「setValue」などを使用するよりも、「push」、「insert」、「removeAt」を使用して FormControl を操作する方が簡単であるという意味で、FormGroup よりも柔軟性があります。フォームの階層で適切に追跡されます。
お役に立てれば。