In my Angular component, I have a Foo
with a property bar
which is an array of string
s.
I want to edit the list of text lines in my form. In my component, I declare
barEditForm = new FormGroup({
bar: new FormArray<FormControl>([])
});
I then initialise my form from the Foo
I have loaded.
foo.bar.forEach((bar: string) => {
this.barEditForm.controls.bar.push(new FormControl(bar));
});
How do I create a form
with an input
for each bar
in my HTML template.
This;
<form [formGroup]="barEditForm" (ngSubmit)="onBarSave(foo.id)">
@for (bar of barEditForm.controls.bar.controls; track $index) {
<input class="form-control" id="bar" type="text" formControlName="$index"/>
}
</form>
does not work!
I assume, I need to iterate over my created controls, hence the for
of barEditForm.controls.bar.controls
.
I also assume I can use $index
as the form control name.
But, I get an error of ERROR TypeError: e is null
and an empty text input.
What is the correct way to do this?
You have to define formArrayName
as bar
, then define the formControlName with property binding.
<form [formGroup]="barEditForm" (ngSubmit)="onBarSave(foo.id)">
<div formArrayName="bar">
@for (bar of barEditForm.controls.bar.controls; track $index) {
<input class="form-control" [id]="'control' + $index" type="text" [formControlName]="$index"/>
}
</div>
</form>
Another option is to use formControl with property binding which does not use $index
<form [formGroup]="barEditForm" (ngSubmit)="onBarSave(foo.id)">
<div formArrayName="bar">
@for (control of barEditForm.controls.bar.controls; track $index) {
<input class="form-control" [id]="'control' + $index" type="text" [formControl]="control"/>
}
</div>
</form>