Reactive Formを作成して保存する親コンポーネントがあります。フォーム配列には複数のフォームグループインスタンスがあります。各フォームグループから子コンポーネントにフォームコントロールを渡したいのですが、これを行う方法がわかりません。
Stackblitz は、私がやりたいことを示しています。また、一部のフィールドは特定の車の「メーカー」にのみ適用されるため、htmlに次の行が含まれています。
<input type="text" *ngIf="car.make != 'ford'" formControlName="model">
「Details」フォームグループフィールドを「details-fields」子コンポーネントに移動したいのですが、そうしようとすると、フォームグループインスタンスがないため、親フォームグループが子コンポーネントに登録されていません。どんな助けも大歓迎です。
何を探すべきかがわかれば、それほど難しくありません。以前にそれをやったことがない場合、それは挑戦になる可能性があります。表示されるエラーメッセージが常に役立つとは限りません。
まず、DetailsFields
コンポーネントにいくつかのものを追加します。新しいInput
sを使用すると、親コンポーネントで構築したフォームグループのインスタンスを渡すことができます。 car
およびcarIndex
入力は、現在のように動作するために子コンポーネントが必要とする値を渡すために使用されます。
import { Component, OnInit, Input } from '@angular/core';
import { FormGroup } from '@angular/forms';
@Component({
selector: 'app-child',
templateUrl: './details-fields.component.html',
styleUrls: ['./details-fields.component.css']
})
export class DetailsFields implements OnInit {
@Input() form: FormGroup;
@Input() car: any;
@Input() carIndex: number;
ngOnInit() { }
}
次に、親コンポーネントにあるテンプレートHTMLの一部を子コンポーネントに移動します。子コンポーネントテンプレート(details-fields.component.html)は、最終的にはこのようになります。 [formGroup]="form"
最初のdiv
が実際のキーです。これは、使用するフォームグループを子テンプレートに指示するものです。この後のコードで親からこれを渡します。
<div [formGroup]="form">
<div class="car-wrap" formArrayName="cars">
<div [ngClass]="car.make + '-car'" [formGroupName]="carIndex">
<p class="title">This car is a {{car.make}}</p>
<div formGroupName="details">
<input type="text" formControlName="make">
<input type="text" *ngIf="car.make != 'ford'" formControlName="model">
<input type="number" formControlName="year">
</div>
<div formGroupName="appearance">
<input type="text" formControlName="color">
</div>
</div>
</div>
</div>
親コンポーネントのテンプレートはこれだけになります。これは、carsForm
およびcar
とともに、carIndex
フォームグループを子コンポーネントに渡す場所です。
<div id="cars" [formGroup]="carsForm">
<div *ngFor="let car of cars; let i = index;">
<app-child [form]="carsForm" [car]="car" [carIndex]="i"></app-child>
</div>
</div>
最後にしたことは、親コンポーネントにあるスタイルをstyles.cssファイルに移動して、すべてのコンポーネントがそれらを使用できるようにすることでした。
それでおしまい!本当にいくつかのコードを移動し、いくつかの入力を追加するだけで、必要なものを子に渡すことができます。