angular angular-reactive-forms formarray formgroups

Formas reactivas: cómo agregar un nuevo FormGroup o FormArray a un FormGroup existente en un momento posterior en Angular 7



angular-reactive-forms formgroups (2)

En los otros ejemplos en StackOverflow hay muchas preguntas sobre el uso de FormGroups en FormArrays. Pero mi pregunta es lo contrario.

FormArrays tiene un método push, que hace que muchas cosas sean posibles. Los Grupos de Formas tienen un método addControl para agregar FormControls simples. Afaik FormGroups no tiene el método addFormArray or addFormGroup . Por eso necesito tu ayuda.

Situación siguiente:

this.myForm = this.fb.group({ id: this.fb.control([this.book.id]), // or short form `id: [this.book.id],` });

Agregar un control simple en un momento posterior es fácil:

this.myForm.addControl(''isbn'', this.fb.control(this.book.isbn));

Pero, ¿qué hay de agregar FormArrays y FormGroups en un FormGroup existente? Por ejemplo, me gustaría usar la siguiente matriz y objeto para este propósito:

const authors = [''George Michael'', ''Aretha Franklin'']; const metaData = { description : ''Great Book'', publication: 2019}

Me gustaría agregar authorArray o metaData solo si existen. Esa es la razón por la que quiero agregarlos más adelante.

ps Por favor, ignora las reglas de validación.


Simplemente puede pasar el FormArray lugar de un FormControl .

this.form.addControl(''arr'',this.fb.array([]));

Edición: Para utilizar el valor existente.

Para usar el valor de la matriz de authors , usa esto:

authors.forEach(author => { (<FormArray>this.form.controls.arr).push(new FormControl(author)); });

O

this.myForm.addControl(''authors'', this.fb.array([''George Michael'', ''Aretha Franklin'']))


FormGroup método FormGroup addControl acepta AbstractControl como parámetro, que puede ser un FormControl o un FormArray u otro FormGroup ya que todos ellos extienden AbstractControl .

class FormGroup extends AbstractControl ... class FormControl extends AbstractControl ... class FormArray extends AbstractControl

FormBuilder puede ayudarlo a construir dichos controles con los métodos array() y group() :

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}) });

Aún puede usar la fábrica después para construir los controles que necesita (sin importar qué tipo de control sea):

this.myForm.addControl(''authors'', this.fb.array([''George Michael'', ''Aretha Franklin''])) this.myForm.addControl(''metaData'', this.fb.group({ description : ''Great Book'', publication: 2019}))