Я думаю, у вас есть небольшая путаница с formArray и Form Group.Массив формы может быть FormArray из FormControls или Form Array из FormGroups.
В Angular мы можем создать FromGroup, используя formBuilder и напрямую.
//Using formBuilder
const formGroup=this.formBuilder.group({
requirequantity: [''],
contracttype: [''],
skilllevel: ['', Validators.required],
...
});
//Directly
const formGroup=new FormGroup({
requirequantity: new FormControl(''),
contracttype: new FormControl(''),
skilllevel: new FormControl('',Validators.required),
...
});
Полезно сделать функцию, котораявернуть formGroup.Мне нравится, если данные из интерфейса делают что-то вроде
getGroup(data:any)
{
data=data || {} as IData
return formGroup=new FormGroup({
requirequantity: new FormControl(data.requirequantity),
contracttype: new FormControl(data.contracttype),
skilllevel: new FormControl(data.skilllevel,Validators.required),
...
});
}
Иначе вы можете использовать что-то вроде
getGroup(data:any)
{
return formGroup=new FormGroup({
requirequantity: new FormControl(data?data.requirequantity:''),
contracttype: new FormControl(data?data.contracttype:''),
skilllevel: new FormControl(data?data.skilllevel:'',Validators.required),
...
});
}
Массив формы может быть одним из свойств FormGroup.,Это
//we can has
details:FormArray=new FormArray([])
//or a form
form=new FormGroup({
details:new FormArray([])
})
Посмотрите, что нам нужно, почти создайте подачу formArray с пустым массивом.
Однажды у нас есть formArray, мы можем добавить в него элементы
let data={requirequantity: 10,
contracttype: 'A',
skilllevel: "1.22.34f",
...
}
this.details.push(getGroup(data)); //Add a formArray a formGroup
this.form.get('details').push(getGroup(null)); //Add an empty group
И .html всегда один и тот же
//If the formArray is a property of a formGroup
<!--the formGroup-->
<form *ngIf="form" [formGroup]="form">
<!--the formArrayName-->
<div formArrayName="details">
<!--a *ngFor over the controls of formArray using FormGroupName-->
<div *ngFor="let item of form.get('details').controls;let i=index"
[formGroupName]="i" />
<!--the input/select/radio using formControlName-->
<input formControlName="requirequantity">
<input formControlName="contracttype">
...
</div>
</div>
</div>
Если это непосредственно formArray
<!--as formGroup the formArray-->
<form *ngIf="form" [formGroup]="details">
<!--a *ngFor over the controls of formArray using FormGroupName-->
<div *ngFor="let group of form.get('details').controls;let i=index"
[formGroupName]="group" />
<!--the input/select/radio using formControlName-->
<input formControlName="requirequantity">
<input formControlName="contracttype">
...
</div>
</div>
Ну, как заметьте, обычно мы используем метод get для ссылки на formArray
get details()
{
return this.contractDetaisForm.get('details') as FormArray
}