Это проще, если вы сначала думаете о данных, которые вы получаете. Я думаю, что вы получите что-то вроде
[{filename:..,agenda:[
{sheetNumber:..,title:...,description...},
{sheetNumber:..,title:...,description...}
...
]
},
{filename:..,agenda:[
{sheetNumber:..,title:...,description...},
{sheetNumber:..,title:...,description...}
...
]
}
....
]
Вы видите, что у вас есть FormArray (серия FormGroup), которая имеет два свойства: «имя файла» и «повестка дня» (Agenda - это новый FormArray)
объявить переменную как formArray
form: FormArray
И создайте две функции.
createItemData(data):FormGroup
{
data=data|| {} as dataI;
return new FormGroup(
{
filename:new FormControl(data.filename),
agenda:new FormArray(data.agenda && data.agenda.length?
data.agenda.map(agenda=>this.createAgendaSheet(agenda)):
[])
}
)
}
createAgendaSheet(data):FormGroup{
data=data|| {} as agendaI;
return new FormGroup(
{
sheetNumber:new FormControl(data.sheetNumber),
title:new FormControl(data.title),
description:new FormControl(data.description),
}
)
}
Посмотрите, как эти функции создают элемент массива. Я использую следующие два интерфейса, чтобы помочь мне создать форму
export interface agendaI {
sheetNumber: number,
title: string,
desription: string
}
export interface dataI {
filename: string,
agenda: agendaI[]
}
Хорошо, будьте осторожны при создании формы:
<button (click)="addAgenda()">Add agenda</button>
<form *ngIf="form" [formGroup]="form">
<!--form is a FormArray, so form.controls will be formGroup-->
<div *ngFor="let control of form.controls;let i=index">
<!--in this form group...-->
<div [formGroup]="control">
<!--we have a fromControl "filename"-->
<input formControlName="filename"/><button (click)="add(i)">add</button>
<!--and a FormArray "agenda"--->
<div formArrayName="agenda">
<div *ngFor="let c of control.get('agenda').controls;let j=index" >
<div [formGroupName]="j">
<input formControlName="sheetNumber">
<input formControlName="title">
<input formControlName="description">
<button (click)="delete(i,j)">delete</button>
</div>
</div>
</div>
</div>
</div>
</form>
Ну, последний шаг - создать функцию add, delete и addAgenda
addAgenda()
{
this.form.push(this.createItemData(null))
}
add(i)
{
(this.form.at(i).get('agenda') as FormArray).push(this.createAgendaSheet(null))
}
delete(i,j)
{
(this.form.at(i).get('agenda') as FormArray).removeAt(j)
}
И, в ngOnInit создайте форму (я использовал константу "data")
ngOnInit() {
this.form=new FormArray(data.map(d=>this.createItemData(d)));
}
Вы можете увидеть «уродливый» результат в stackblitz