Reactive Forms: How to add new FormGroup or FormArray into an existing FormGroup at a later point in time in Angular 7/8/9
FormGroup
addControl method accepts AbstractControl
as parameter which can be either a FormControl
or a FormArray
or another FormGroup
as they all extend AbstractControl
.
class FormGroup extends AbstractControl {}
class FormControl extends AbstractControl {}
class FormArray extends AbstractControl {}
FormBuilder can help you building such controls with array()
and group()
methods:
this.myForm = this.fb.group({
id: this.fb.control([this.book.id]),
authors: this.fb.array(['George Michael', 'Aretha Franklin']),
metaData: this.fb.group({ description : 'Great Book', publication: 2019})
});
You still can use the factory afterwards to build the controls you need (no matter what kind of control it is):
this.myForm.addControl('authors',
this.fb.array(['George Michael', 'Aretha Franklin']))
this.myForm.addControl('metaData',
this.fb.group({description: 'Great Book', publication: 2019}))
You can simply pass the FormArray
instead of a FormControl
.
this.form.addControl('arr',this.fb.array([]));
Edit: To use existing value
To use the value from the authors
array, use this:
authors.forEach(author => {
(<FormArray>this.form.controls.arr).push(new FormControl(author));
});
OR
this.myForm.addControl('authors', this.fb.array(['George Michael', 'Aretha Franklin']))