William Moreno
Porque no usar un OnChanges
ngOnChanges(changes: SimpleChanges): void
David Nieto
si tienes más de un input, puede que se emita más de una vez, y estes haciendo más patchvalues. recomiendo mejor los sets, como lo muestra en la clase.
Implementar el patrón de smart and dumb components en Angular trae beneficios claros en separación de responsabilidades, pero también introduce retos concretos cuando la información que fluye entre componentes es asíncrona. Aquí se aborda cómo resolver uno de los problemas más comunes: que el formulario no se rellene correctamente al editar, y la solución elegante que ofrece usar un setter en el input del componente.
¿Por qué el formulario no se rellena al editar con smart and dumb components?
Al separar responsabilidades, el smart component se encarga de obtener la categoría desde el servidor y enviarla al dumb component mediante un input. Sin embargo, al migrar la lógica de patchValue fuera del componente inteligente, el formulario deja de recibir los datos para rellenarse [01:06].
El problema es claro: el input recibe la categoría, pero en ningún momento se ejecuta un patchValue que lleve esa información al formulario. Simplemente se recibe el dato y se usa para validaciones visuales, no para poblar los campos.
¿Se puede usar el constructor o ngOnInit para resolver esto?
La solución más precisa es convertir el input en un setter [02:32].
¿Cómo funciona un setter en un input de Angular?
Así como existen getters, también existen setters. Al definir el input como un set, se obtiene el momento exacto en que la información llega al componente, sin importar si es asíncrona o no [02:42].
typescript @Input() set category(data: Category) { if (data) { this.form.patchValue(data); this.isNew = false; } }
data existe, se ejecuta patchValue para llenar el formulario y se marca isNew como false.isNew permanece en true por defecto, indicando que se trata de una creación.Esta variable isNew de tipo boolean reemplaza la referencia directa a category en el template, ya que al convertir el input en un método, deja de comportarse como una variable con estado [03:22].
¿Cómo impacta el setter en la lógica de guardado y en el template?
Con la bandera isNew disponible, la lógica del método save se simplifica [05:28]:
isNew es true, se ejecuta la creación.isNew es false, se ejecuta la actualización.En el HTML del dumb component, el texto del botón cambia dinámicamente: muestra "crear" cuando isNew es verdadero y "editar" cuando es falso [04:08].
html <button>{{ isNew ? 'Crear' : 'Editar' }}</button>
¿Qué ventajas ofrece esta técnica en el ciclo de vida de Angular?
Usar un setter en el input garantiza varias cosas importantes [04:24]:
constructor y ngOnInit, por lo que se pueden usar con confianza métodos e instancias declaradas.Es fundamental mantener la calma al encontrar errores durante estos cambios. Leer con atención los mensajes de la consola y aplicar correcciones de forma pausada es parte natural del proceso de refactorización [05:50].
El patrón de smart and dumb components combinado con setters en los inputs es una estrategia de arquitectura muy valorada profesionalmente. Dominar esta técnica permite construir componentes más predecibles, mantenibles y con responsabilidades bien definidas. Si ya lo implementaste, cuéntanos cómo te fue en los comentarios.
William Moreno
Porque no usar un OnChanges
ngOnChanges(changes: SimpleChanges): void
David Nieto
si tienes más de un input, puede que se emita más de una vez, y estes haciendo más patchvalues. recomiendo mejor los sets, como lo muestra en la clase.
Daniel Ramírez Castaño
¿Por qué no usar @ViewChild para pasar category: Category al dumb component? Así se evitaría crear banderas en el componente dumb y se actualizaría la variable category de manera asíncrona
!SmartComponent -> DumbComponent
Daniel Meza
Sin duda es un camino más optimo
Diego Fernando Caviedes Camaho
que buen dato gracias.!
Edgar Benitez
Es posible que revivan la rest? Comence este curso la semana pasada y la rest esta muerta...si bien he avanzado, no veo los resultados en tu totalidad
LUIS DAVID MEDINA GAVIRIA
17 dias de este comentario y todavia sigue muerta la api
Pablo Andrés Prado Diaz
1095 días después y la API sigue muerta
Lenín Casco
Muy buen curso.. Al momento de crear una categoria, que pasa si despues de escoger la imagen, el usuario se arrepiente? iria quedando "basura" en fireStorage?
Juan Carlos Pinzón
Eso mismo pensé. Pero te cuento una estrategia que utilizamos en mi trabajo en donde efectivamente hay un backend bien estructurado.
Cuando tenemos un formulario que incluye la carga de un archivo (image, audio, etc) cuando el usuario carga el archivo mientras está diligenciando el form este archivo es cargado a un directorio temporal y retornamos el nombre, extensión y demás info que se requiera y esta la asociamos a un campo en el formulario. Cuando se envía el formulario no enviamos el archivo pues ya se está enviando la info de este y pues en el backend sabemos en donde se guarda. Una vez procesada la información lo que hacemos es mover el archivo donde corresponda o subirlo a un cloud storage que tengamos (S3, FirebaseStorage, etc).
Si el usuario por ejemplo cuando está 'llenando' el formulario se arrepiente y sube otro archivo, pues el archivo que subió anteriormente quedará en el directorio temporal evidentemente, para no acumular estos archivos basura tenemos un script que periódicamente borrará esos archivos que no se usaron o se subieron en vano.
Nicolas Molina
ProfesorEfecitivamente queda estas imagenes "basura" en FirebaseStorage, la solución que da el compañero Juan es excelente y tiene buena UI.
Otra es que el backend directamente haga la carga del archivo es decir con cosas como Multer de Node hacer la carga de la imagen una vez el usuario le dio click.