FormGroupは、各子コントロールの値を、各コントロール名をキーとして1つのオブジェクトに集約します。
const form = new FormGroup({ first: new FormControl('Nancy', Validators.minLength(2)), last: new FormControl('Drew'), });
FormArrayは、各子FormControlの値を配列に集約します。
const arr = new FormArray([ new FormControl('Nancy', Validators.minLength(2)), new FormControl('Drew'), ]);
一方を他方に対して使用する必要があるのはいつですか?
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よりも柔軟性があります。フォームの階層で適切に追跡されます。
お役に立てれば。
リアクティブフォームを作成するには、親FormGroup
が必要です。このFormGroup
には、さらにformControls
、子formGroups
、またはformArray
を含めることができます
FormArray
には、formControls
の配列またはformGroup
自体をさらに含めることができます。
formArrayはいつ使用する必要がありますか?
この美しい post を読んでください。これはformArray
の使い方を説明しています
そのブログの興味深い例は、旅行formGroup
についてです
formGroup
およびformControl
を使用した旅行formArray
の構造は次のようになります。
this.tripForm = this.fb.group({
name: [name, Validators.required],
cities: new FormArray(
[0] ---> new FormGroup({
name: new FormControl('', Validators.required),
places: new FormArray(
[0]--> new FormGroup({
name: new FormControl('', Validators.required),
}),
[1]--> new FormGroup({
name: new FormControl('', Validators.required),
})
)
}),
[1] ---> new FormGroup({
name: new FormControl('', Validators.required),
places: new FormArray(
[0]--> new FormGroup({
name: new FormControl('', Validators.required),
}),
[1]--> new FormGroup({
name: new FormControl('', Validators.required),
})
)
}))
})
この DEMO で遊ぶことを忘れずに、旅行のcities
およびplaces
の配列の使用に注意してください。
angularドキュメントから、次のことがわかります。
FormArrayは、任意の数の名前のないコントロールを管理するためのFormGroupの代替です。フォームグループインスタンスと同様に、フォーム配列インスタンスに対してコントロールを動的に挿入および削除でき、フォーム配列インスタンスの値と検証ステータスはその子コントロールから計算されます。ただし、各コントロールのキーを名前で定義する必要はありません。したがって、子の値の数が事前にわからない場合、これは素晴らしいオプションです。
それらの例を示して、私がこれをどのように理解しているかを説明してみましょう。ソースを見ることができます こちら
魔女が次のフィールドを持っていると想像してください
profileForm = this.fb.group({
firstName: ['', Validators.required],
lastName: [''],
address: this.fb.group({
street: [''],
city: [''],
state: [''],
Zip: ['']
}),
aliases: this.fb.array([
this.fb.control('')
])
});
ここにはfirstName
、lastName
、address
、およびaliases
があります。すべてのフィールドはフォームグループなので、すべてをgroup
でラップします。同時にaddress
はサブグループのようなものなので、別のgroup
でラップします(理解を深めるためにテンプレートを見ることができます)!ここでのすべてのフォームは、key
を除くaliases
を制御します。つまり、formBuilder
のようなPush
メソッドを使用して、単純な配列のように値を必要なだけプッシュできます。
これは私がそれを理解する方法です、それが誰かを助けることを願っています。