Actualización de tareas con Angular y programación inmutable
Resumen
¿Cómo actualizar una tarea en Angular?
Actualizar tareas de manera eficiente es crucial en el desarrollo de aplicaciones en Angular. Este proceso no solo mejora la funcionalidad, sino que también ilustra la forma de trabajar con arrays de manera inmutable, siguiendo las buenas prácticas de Angular y utilizando técnicas modernas como las señales (signals).
¿Cómo visualizar el estado de tareas?
Para comenzar, es esencial visualizar el estado actual de las tareas. Una forma efectiva de hacerlo es imprimir su estado en formulario JSON mediante Angular:
<pre><code>{{ tasks | json }}</code></pre>
Esta simple adición permite que el estado de la lista de tareas se renderice de forma clara en el navegador, utilizando un pipe llamado JSON proporcionado por Angular. Esta técnica es muy útil para la depuración.
¿Cómo diseñar el método de actualización?
Implementar el método updateTags es el siguiente paso lógico. Este método se encarga de actualizar tareas de acuerdo con su posición en el array:
Identificar la tarea a modificar: Localizar la posición de la tarea en el array.
Actualizar inmutablemente: Al modificar arrays debemos evitar modificar el array original. La solución es crear un nuevo estado sin alterar el original, aplicando métodos inmutables.
En este código, map recorre todos los elementos del array. Si la posición actual coincide con el índice proporcionado, crea un nuevo objeto de tarea con el estado completed invertido. Esto garantiza que el array original permanezca sin cambios.
¿Cómo integrar el evento con el frontend?
Para completar la función de actualización, debemos integrar el rendimiento visual y permitir al usuario interactuar con la tarea:
Vinculación de datos: Asegúrate de que el estado de la tarea esté vinculado:
Iteración y visualización: Utilizar un *ngFor para renderizar cada tarea y un change event para ejecutar la función updateTags.
¿Cómo verificar la funcionalidad?
Probar en el navegador es vital para confirmar que cada actualización se refleje tanto visualmente como en el estado JSON. Así, cualquier cambio en el estado de una tarea se refleja inmediatamente.
Además, se puede agregar un contador dinámico para mostrar cuántas tareas están presentes utilizando la interpolación de strings. Esto realza la utilidad de las señales de Angular que administran la cantidad de tareas:
<p>Total de tareas: {{ tasks.length }}</p>
Mediante estas prácticas, se asegura un desarrollo de aplicaciones sólido y escalable en Angular. Te animamos a seguir explorando estas técnicas avanzadas que no solo optimizan tu código, sino que también mejoran la experiencia del usuario.
Mmmm no se si esta solucion respete el principio de inmutabilidad que ha estado indicado el profe en las clases.
Efectivamente, no lo respeta. Pero es funcional. Si quieres respetarlo debes crear un nuevo estado de la señal, con el fin de que ese estado se pueda identificar en el DOM de una manera reactiva. Recuerda que identificar no es lo mismo que reflejar.
Debe de ser una gran coincidencia que el código del profesor se parezca al mio 😅
Inmutabilidad
¿Qué se hace generalmente cuando necesitas un objeto idéntico al original, pero solo con algunos atributos diferentes? Hasta ahora lo que hacíamos es mutar la variable original y continuar con nuestras vidas. Pero si consideramos esa variable como inmutable entonces tendremos que hacer una copia. Pero ¿crear un objeto nuevo por cada cambio no sería costoso? y a la respuesta es: sí, ya que se debe instanciar nuevamente en memoria.
Es por esto que le debemos dar importancia a la utilización de funciones a la hora de manipular una estructura de datos como los objetos, arreglos, etc...
¿Qué herramientas nos ofrece JavaScript?
Object.assign
Object.assign permite crear un nuevo objeto copiando los valores que le son pasados como parámetros.
Para que función el JsonPipe, debes de agregarlo en tus imports del @Component de tu component.ts
toggleTaskStatus(index: number) { this.tasks.update(tasks => { tasks[index].completed = !tasks[index].completed return tasks }) } yo hice de esta forma, es valida ?
Sí, tu implementación es válida. Estás actualizando el estado de la tarea en función del índice proporcionado y cambiando el valor de la propiedad 'completed' a su opuesto. Luego, devuelves el estado actualizado. ¡Buen trabajo!
para los que les da error el pipe | json, deben importar:
import { JsonPipe } from '@angular/common';
Que hermosa forma de debugear
Me gusta, aunque me cuesta un chin la sintaxis ♥
Desde mi punto de vista el contador debería de mostrar las tareas que aún no se han completado, aunque tengamos un array de 10 tareas de las cuales ya se completaron 6, solo restarían 4 tareas.
Para hacerlo hice estos cambios: countCompletedTasks() { return this.tasks().reduce((pv, cv) => !cv.completed ? pv + 1 : pv, 0); }
Me llevo que gracias a Signals, cualquier cambio en una tarea se refleja automáticamente tanto en la interfaz como en indicadores derivados, como el contador total de tareas, sin lógica adicional.
📍Integración entre lógica y frontend
Me llevo que la actualización de tareas se completa al vincular eventos del frontend, como (change) en un checkbox, con métodos del componente que modifican el estado de forma reactiva.
📍Uso de Signals para actualizar tareas
Me llevo que el método update de Signals permite transformar el estado existente, recorriendo las tareas y devolviendo una nueva versión solo del elemento que cambia, manteniendo el resto intacto.
📍Actualizar arrays de forma inmutable
Me llevo que al actualizar una tarea en Angular es fundamental no modificar el array original, sino crear un nuevo estado usando métodos como map, siguiendo buenas prácticas de inmutabilidad.
que cool el truquito para hacer debbuging
Yo lo resolví de esta forma que respeta la inmutabilidad y es igual de larga: