проблема в вашем источнике данных, пусть i = index ссылается на значения источника данных, если в вашем массиве меньше элементов, чем в вашем источнике данных, ваш код сбоя
Если все ваши элементы в таблицепринадлежит к FormArray, это "просто", вы можете увидеть пример в этот стек
Есть два ключа,
один, как создать форму
myform:FormGroup=new FormGroup({
distribution:new FormArray(ELEMENT_DATA.map(x=>{
return new FormGroup({
position:new FormControl(x.position),
name:new FormControl(x.name),
weight:new FormControl(x.weight),
symbol:new FormControl(x.symbol),
})}))
});
И, как мы ссылались на элементы управления
<form *ngIf="myform" [formGroup]="myform">
<ng-container formArrayName="distribution">
<!--see that datasource is myForm.get('distribution').controls-->
<table mat-table [dataSource]="myform.get('distribution').controls" class="mat-elevation-z8" >
<ng-container matColumnDef="position">
<th mat-header-cell *matHeaderCellDef> No. </th>
<!--so, "element" is a formGroup-->
<td mat-cell *matCellDef="let element;let i=index" [formGroup]="element"> <input formControlName="position" > </td>
</ng-container>
....
</table>
</ng-container>
</form>
Но у вас есть «источник данных» и форма массива, некоторые не считаются.Вы можете создать функцию для ссылки на массив
get distributionArray()
{
return this.myForm.get('distribution') as FormArray
}
И использовать в своем тд тандеме что-то вроде
<td mat-cell *matCellDef="let element;let i=index"
[formGroup]="distributionArray.at(i)">
<input formControlName="name" >
</td>
}
ну, это не обязательно имеет значение длявсе, но должно быть так много элементов в массиве, как в источнике данных, например,
this.myform:FormGroup=new FormGroup({
distribution:new FormArray(ELEMENT_DATA.map(()=>{
//only two properties empty
return new FormGroup({
weight:new FormControl(),
symbol:new FormControl(),
})}))
});
или использование push
this.myform:FormGroup=new FormGroup({
distribution:new FormArray([])
});
ELEMENT_DATA.forEach(()=>{
(this.myForm.get('distribution') as FormArray).push(this.createArray())
}