Carlyle Komalram
Juan Carlos Castillo Gómez
¿Cómo crear campos bajo demanda en Formularios Reactivos de Angular?
La capacidad de crear campos de formulario bajo demanda es una de las características más potentes y útiles de Angular Reactive Forms. Similar a aplicaciones como Google Form, donde los usuarios pueden adicionar dinámicamente inputs a medida que los necesitan, Angular permite implementar esta funcionalidad a través del uso de FormArray. Esto no solo proporciona mayor flexibilidad, sino que además enriquece la experiencia del usuario al permitir gestionar sus necesidades exactas en tiempo real.
¿Cómo funciona la creación de campos dinámicos?
Los campos dinámicos se crean utilizando la clase FormArray. En términos simples, FormArray es una colección de controles que permite añadir y gestionar dinamismo en los formularios. En nuestro ejemplo, lo usaremos para agregar campos de dirección de manera dinámica a una orden de compra en un componente de Angular.
const direccionArray = this.formBuilder.array([ this.crearDireccion() ]); createDireccion(): FormGroup { return this.formBuilder.group({ zip: ['', Validators.required], text: ['', Validators.required] }); }
Esta estructura inicializa el FormArray con un método que crea un FormGroup para las direcciones.
¿Cómo se implementa en el HTML de Angular?
En el HTML, comenzaremos creando un botón para añadir un nuevo campo de dirección, y un contenedor que iterará sobre el FormArray utilizando ngFor para renderizar cada grupo de dirección dinámicamente.
<button (click)="addDireccion()">Agregar Dirección</button> <div *ngFor="let direccion of direccionArray.controls; let i = index"> <div [formGroup]="direccion"> <input formControlName="zip" placeholder="Código Postal"/> <input formControlName="text" placeholder="Dirección"/> </div> </div>
Este fragmento de código itera sobre cada dirección en el FormArray, permitiendo al usuario ingresar el código postal y la dirección de cada nueva entrada que decidan agregar.
¿Cómo agregar funcionalidad al botón de añadir dirección?
Es fundamental vincular el botón de "Agregar Dirección" a un método que actualice el FormArray con un nuevo FormGroup cada vez que se presione. Aquí se muestra cómo implementar esto en TypeScript:
addDireccion(): void { this.direccionArray.push(this.crearDireccion()); }
En este método, llamaremos a crearDireccion(), que añade un nuevo grupo de dirección al FormArray cada vez que el usuario interactúa con el botón.
¿Cómo validar y obtener los datos del formulario?
Para validar y recoger los datos ingresados, podemos utilizar la propiedad value de Angular y las funciones de validación integradas:
onSubmit() { if (this.form.valid) { console.log(this.form.value); } else { console.error('Formulario inválido'); } }
Este método verifica si el formulario es válido y luego loguea los valores de cada campo de dirección agregado por el usuario.
¿Cuáles son las ventajas de usar un Form Array?
Utilizar FormArray ofrece múltiples beneficios:
Recursos adicionales y motivación
Angular ofrece una documentación exhaustiva y ejemplos para profundizar en el tema de los formularios dinámicos. Este tutorial sirve como una base sólida, pero te animo a explorar más a detalle para construir formularios complejos como sistemas similares a Google Forms, donde puedes personalizar cada tipo de entrada.
Así que, ¡adelante, sigue aprendiendo y expandiendo tus habilidades con Angular! Aprovecha las poderosas herramientas que tienes a la mano y lleva tus proyectos al siguiente nivel.
Carlyle Komalram
Juan Carlos Castillo Gómez
David Trespalacios
Yeimy Lorena Escobar Rivera
José Luis García Peceros
Johan Steward Galeano Torres
Franklin Gil
Emilio Nicolás Mendoza Patti
Oscar Bravo
Diego Fernando Caviedes Camaho
Diego Fernando Caviedes Camaho
Carlos Alejandro Hernández Mejía
Recuerden importar el modulo de reactiveForms al modulo de ordenes
import { ReactiveFormsModule } from '@angular/forms';
no lo había notado, Gracias!
Para tener en cuenta cuando usamos esta característica y luego usamos patchValue para rellenar los campos en el modo de editar, Se deben primero agregar tantos ítems al FormArray como tenga el array a editar, de lo contrario no se muestra en pantalla.
Aquí un link de como construir un formulario reactivo asíncrono
Hola no entiendo muy bien la variable I formGroupName, por que se tendría que igualar a la variable "I" y no a la variable let adress del iterador?
porque la variable i hace referencia a la posición en el array de adressField
address es el valor, pero necesitas colocarle la posicion en el array. Pueden existir 2 address iguales si tu programa lo permite.
Dejo mi aporte de la funcionalidad para eliminar los campos generados por el usuario.
Codigo .html
<button mat-fab color="primary" aria-label="Example icon button with a delete icon" (click)="deleteAddressField(i)"> <mat-icon>delete</mat-icon> </button>
Codigo .ts
deleteAddressField(index: number ){ this.addressField.removeAt(index) }
Es una clase muy interesante. Esto da mucho dinamismo a los formularios.
¿Cuál sería el procedimiento en el momento de la edición, sobre todo si se guardaron más de una dirección?
que es un Abstract Control ? es una clase instanciada del formBuilder?
Si quieren un tipado mucho mejor
private createAddressField(): FormGroup{ return this.formBuilder.group({ zip: ['', Validators.required], text: ['', Validators.required], }); } get addressField(): FormArray{ //return <FormArray>this.form.get('address') return this.form.get('address') as FormArray//return Abstract Control as FormArray }
Esta clase estuvo genial, hasta el momento tenía una vaga idea de como hacerlo, pero esto concretó algunas dudas. Sin duda alguna seguiré el tutorial de la documentación oficial 😁.