I am working on a dynamic Form in Angular. There should be an array in another array.
But it has a problem with my form and the following error appears:
[Cannot find control with path: 'gruppen -> 0 -> prueffolge'][1] I have a object structure like this:
"pruefplanTemplate": {
"gruppen": [
"prueffolge": 100,
"name": "test",
"pruefungen": [
"..": "",
"..": ""
]
]
}
This is my code: Component:
import { Component, OnInit } from '@angular/core';
import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-pruefplan-template',
templateUrl: './pruefplan-template.component.html',
styleUrls: ['./pruefplan-template.component.scss']
})
export class PruefplanTemplateComponent implements OnInit {
form = this.fb.group({
gruppen: this.fb.array([
new FormGroup({
pruefungen: this.fb.array([])
})
])
});
constructor(private fb: FormBuilder) { }
ngOnInit(): void {
}
get gruppen() {
return this.form.controls["gruppen"] as FormArray;
}
addPruefplanGruppe() {
const gruppeForm = this.fb.group({
prueffolge: [100, Validators.required],
name: ['', Validators.required],
pruefungen: [[]]
});
this.gruppen.push(gruppeForm);
}
deleteGruppe(gruppenIndex: number) {
this.gruppen.removeAt(gruppenIndex);
}
getPruefung(index: number, control: any): AbstractControl[] {
var pruefungen = control[index].controls;
return pruefungen;
}
addPruefschritt(index: number, gruppe: any) {
var formArray = gruppe.controls['pruefungen'] as FormArray;
const pruefschrittForm = this.fb.group({
beschreibung: ['', Validators.required],
erledigt: [false, Validators.required],
reaktion: ['', Validators.required],
bemerkung: ['', Validators.required]
});
this.getPruefung(index, gruppe).push(pruefschrittForm);
}
}
Template:
<h3>Prüfplan erstellen:</h3>
<p>{{this.gruppen.length}}</p>
<div class="add-lessons-form" [formGroup]="form">
<ng-container formArrayName="gruppen">
<ng-container *ngFor="let gruppeForm of gruppen.controls; let i = index">
<div class="lesson-form-row" [formGroupName]="i">
<mat-form-field appearance="fill">
<input matInput formControlName="prueffolge" placeholder="Prüffolge">
</mat-form-field>
<mat-form-field appearance="fill">
<input matInput formControlName="name" placeholder="Name">
</mat-form-field>
<mat-icon class="delete-btn" (click)="deleteGruppe(i)">delete_forever</mat-icon>
<ng-container formArrayName="pruefungen">
<ng-container *ngFor="let pruefschritt of getPruefung(i, gruppeForm); let j = index">
<div class="pruefschritt-form-row" [formGroupName]="j">
<mat-form-field appearance="fill">
<input matInput formControlName="beschreibung" placeholder="Beschreibung">
</mat-form-field>
<mat-form-field appearance="fill">
<input matInput formControlName="erledigt" placeholder="Erledigt"> //TODO: Boolean
</mat-form-field>
<mat-form-field appearance="fill">
<input matInput formControlName="reaktion" placeholder="Reaktion">
</mat-form-field>
<mat-form-field appearance="fill">
<input matInput formControlName="bemerkung" placeholder="Bemerkung">
</mat-form-field>
</div>
</ng-container>
</ng-container>
</div>
<button mat-mini-fab (click)="addPruefschritt(i, gruppeForm);">
Prüfschritt
<mat-icon class="add-course-btn">add</mat-icon>
</button>
</ng-container>
</ng-container>
<button mat-mini-fab (click)="addPruefplanGruppe();">
Gruppe
<mat-icon class="add-course-btn">add</mat-icon>
</button>
</div>
Model:
export interface PruefplanTemplate {
gruppen: Gruppe[];
}
export interface Gruppe {
prueffolge: number;
name: string;
pruefungen: Pruefung[];
}
export interface Pruefung {
beschreibung: string;
erledigt: boolean;
reaktion: string;
bemerkung: string;
}
I hope someone has more experience with FormArray than me!
Thank you guys! [1]: https://i.sstatic.net/hEAGL.png
formproperty, that first group you're manually adding only has thepruefungencontrol, so its missing bothnameandprueffolgecontrols, being the latter the one showing up in the error.