あなたのスタートは良いですが、ソースコードを別に書く必要があります。
app.components.ts
の代わりに、my-array.component.ts
が子コンポーネントです。
当社の試験データ
classFields1: any[] = ['firstname', 'lastname', 'email', 'password'];
classFields2: any[] = ['country', 'city', 'street', 'zipcode'];
ステップフォーム作成のための1. FormBuilder(app.component.ts)
あなたは、このよう@angular/forms
からFormBuilder
とFormGroup
をインポートする必要があります。
import { FormBuilder, FormGroup } from '@angular/forms';
コンストラクタで:
ngOnInit() {
this.myForm = this.formBuilder.group({});
}
ステップ3.(動的FormControlsを作成します。
constructor(private formBuilder: FormBuilder) { }
ステップ2.今、あなたはこのようngOnInit
に新しい空のFormGroupを定義することができますFormGrooup
新しい空の定義しますapp.component.ts)
これで、w動的にFormControls
を作成し、反復回数classFields
で作成します。このため私は独自の関数を作成することをお勧めします。この関数は、2つのパラメータ:arrayName
とclassFields
を取得します。 arrayName
を使用すると、FormArray
-controlのカスタム名を設定できます。 classFields
- 私たちは反復のために使用します。我々はと呼ばれる空のFormArray
の定数変数を作成します。その後、classFields
を繰り返し、control
と呼ばれる各要素FormControl
を作成し、control
をarrayControls
にプッシュします。この関数の最後にarrayName
を使用して、arrayControls
をフォームにカスタム名で追加します。
createDynamicArrayControls(arrayName: string, classFields: any[]) {
const defaultValue = null;
const arrayControls: FormArray = this.formBuilder.array([]);
classFields.forEach(classField => {
const control = this.formBuilder.control(defaultValue, Validators.required);
arrayControls.push(control);
})
this.myForm.addControl(arrayName, arrayControls);
}
インポートFormControl
と@angular/forms
からFormArray
:ここでは一例です。あなたのインポート行は次のようにする必要があります:
import { FormBuilder, FormGroup, FormArray, FormControl } from '@angular/forms';
今ngOnInit
でcreateDynamicFormControls
-functionを呼び出します。このダイナミックなフォームのための
ステップ4 HTMLテンプレート(app.component.html)
この例では、私は次のテンプレートを作成:ここでは
<h1>My Form</h1>
<form [formGroup]="myForm">
<div formGroupName="test1">
<app-my-array [classFields]="classFields1" [arrayFormName]="myForm.controls.test1"></app-my-array>
</div>
<div formGroupName="test2">
<app-my-array [classFields]="classFields2" [arrayFormName]="myForm.controls.test2"></app-my-array>
</div>
<button type="button" (click)="saveForm()">Submit</button>
</form>
を我々はformGroupName
持つ新しいdiv要素を持っています。このグループ名は、arrayName
という形式です。フォーム配列は@Input
からmy-array.component
になります。
ステップ5 MyArrayComponent
は今、このコンポーネントは非常にsimnpleです:ここでは
import { Component, OnInit, Input } from '@angular/core';
import { FormGroup } from '@angular/forms';
@Component({
selector: 'app-my-array',
templateUrl: './my-array.component.html',
styleUrls: ['./my-array.component.css']
})
export class MyArrayComponent implements OnInit {
@Input() classFields: any[];
@Input() arrayFormName: FormGroup;
constructor() { }
ngOnInit() { }
}
我々は2つだけ@Input
varibalesを持っています。 (私は知っている、この変数は良い名前を持つことができます:-))。 MyArrayComponent
<div [formGroup]="arrayFormName">
<div *ngFor="let class of arrayFormName.controls; let index = index;">
<label [for]="classFields[index]">{{ classFields[index] }}</label>
<input type="text" [id]="classFields[index]" [formControlName]="index" />
</div>
</div>
<br>
そして、ここで用
ステップ6. HTMLはStackblitzに例を取り組んでいる:https://stackblitz.com/edit/angular-wawsja
あなたには、いくつかの質問はコメントで私に尋ねるか、反応性フォームabour角度のドキュメントを読んでいればhere 。
https://angular.io/guide/dynamic-formでは、あなたはディナミックfromsの完全な例を持っています – Eliseo
私はすでにそれを読んだことがありますが、私は誤読しているか、私の質問に答えていません。これは単にmyFormArrayで行った異なる入力に基づいてフォームのプロパティを変更するだけです。 – ellusion
[Angular2で入力フォームを動的に作成する](https://stackoverflow.com/questions/47026895/dynamically-creating-input-forms-in-angular2) – FussinHussin