La edición de categorías en Angular es un proceso que puede hacerse de manera eficiente utilizando el método patch value. Este método permite incluir toda la información necesaria dentro de un solo formulario, ya sea para editar o crear una categoría. El enfoque de reutilización de código facilita enormemente el proceso, especialmente cuando el formulario requiere los mismos campos para ambas funciones.
¿Cómo se detecta si se está creando o editando una categoría?
El truco para distinguir entre la creación y la edición se basa en el uso del enrutamiento y los parámetros de URL. En el código se manejan dos rutas principales: crear y editar. La edición recibe un identificador (ID) de la categoría a modificar. De esta manera, el código puede determinar si se está creando una nueva categoría o editando una existente con base en la presencia de dicho ID.
import{ActivatedRoute}from'@angular/router';// Inyectar ActiveRoute para obtener parámetros de la URLprivate route:ActivatedRoutengOnInit():void{this.route.params.subscribe((params:Params)=>{this.categoryID= params['id'];if(this.categoryID){this.getCategory();}});}
¿Cómo se inyectan los valores en el formulario?
Una vez obtenidos los datos de la categoría, se deben inyectar al formulario. Este paso es esencial para mostrar correctamente la información existente en el caso de edición:
Se debe utilizar el método patchValue que permite cargar los datos en el formulario de manera automática.
Alternativamente, se puede establecer cada campo manualmente con setValue.
this.form.patchValue({ name: data.name, description: data.description,// Otros campos aquí});
¿Cómo gestionar la imagen en el formulario?
El manejo de imágenes puede presentar retos adicionales, especialmente cuando se trata de formularios asíncronos, como un upload a Firebase. Afortunadamente, hay formas de solucionarlo:
Vincular el campo de imagen con el formControl adecuadamente para asegurar que el método patchValue distribuya la información correcta.
En ocasiones, es necesario asegurarse de que el campo value no esté vacío o nulo antes de mostrar la imagen.
Para garantizar que tanto la creación como la edición funcionen sin contratiempos:
Validar: Comprobar la presencia del ID antes de intentar una petición de datos.
Mostrar mensajes de error: Implementar mensajes de alerta o cambios visuales si el procesamiento de datos falla en cualquier etapa.
Optimizaciones en el manejo del DOM: Modificar el DOM solo cuando sea necesario, minimizando el uso de procesos asíncronos para elementos no esenciales.
Con estas prácticas, se logra una experiencia de usuario fluida y un desarrollo eficiente. Este enfoque está diseñado para facilitar la escalabilidad y la mantenibilidad del código, maximizando la reutilización y minimizando las complicaciones. Siguiendo estos pasos, puedes abordar con confianza la tarea de edición y creación de categorías en Angular.
Quisiera abrir una discusión y es acerca de la captura del parámetro "id" para la opción de editar (modificar, actualizar, etc).
Leía un poco en la web que cuando usamos ActivatedRoute los params los obtenemos a través de un Observable y que a través de ActivatedRouteSnapshot, era una captura estática de los params, cuando se inicializaba el componente. Cuando se usa como observable, efectivamente es para estar pendiente ante un cambio del param (Ej: Filtros), para este caso yo considero que el parámetro no es muy volátil que digamos, así que desde mi perspectiva podría usarse el snapshot de la ruta y con eso podríamos trabajar sin problema.
Desde mi visión los observables son estupendos, pero a veces dependiendo del caso de uso pueden ser tediosos (para un principiante como yo jeje).
Pregunté también en Discord de Angular Community y me respondieron esto:
Given the chance, I would always choose to use an Observable
Because Observables make it so easy to build powerful reactive apps. Everything (except a few things) in Angular is Observable.
Which is awesome. Learn Observable, Live Observable, Dream Observable. Turn everything into Observable. And you will have a long and successful career in Angular.
Typically you would need to do something this that parameter, maybe fetch some data from an api. You can ActivateRoute param observable .pipe(mergeMap(param => getFromApi(param), assign that to a property, then | async in the template and there is your data
no siempre, puede que la información allá sido actualizada por otro usuario, supongamos que tienes un Marketplace y manejas disponibilidades para el pedido, si te traes la información desde la tabla y no lo consultas desde el api, posiblemente puede que varios valores hayan cambiado para cuando generes la solicitud.
Excelente curso, en el caso del PatchValue ¿cual es el requisito para que pueda llenar automaticamente los campos? ¿deben llamarse igual los inputs del formulario que los campos que llegan de la base de datos?
SI exacto para que funcione debes pasarle un obj en donde los inputs se llamen igual, sería genial que así mismo te los retorne tu backend para que sea más simple aunque no siempre vas a tener ese caso.