Vicente Benavides
Gustavo Medina Limon
Adrian Robles
Vicente Benavides
Gustavo Medina Limon
Adrian Robles
Giovanni Andres Alzate Agudelo
Andres Felipe Gutierrez Jimenez
Juan Luis Oropeza
Brenda Sutara
Angel Javier Sanchez Tenjo
Andres Felipe Gutierrez Jimenez
Andres Felipe Bolaños Fernandez
norelys solorzano
Mateo Arteaga Rodriguez
Juan R Rossano
Nicolas Molina
Andres Felipe Gutierrez Jimenez
Platzi
Nicolas Molina
Marlon Estiben Varon Gonzalez
Miguel Angel Castillo Amador
Nicolas Molina
andres.otalvaro
Sebastian Torrejon Rubio
Gabriel Huaman
César Augusto Cortés Labrada
ROBERT NAVARRO
Henry Alcaraz
Diego León
Carolina Pulido Gómez
Carolina Pulido Gómez
Carolina Pulido Gómez
Stiven Arboleda
Adrian Robles
Adrian Robles
josué valencia
JHONATAN AGUILERA GARCIA
La modificación para que no permita editar tareas ya completadas.
Excelente!
enterEditingMode(index:number){ this.tasksSignal.update(taskSignal =>{ return taskSignal.map((task, position) =>{ if(index === position && task.completed !== true){ return { ...task, editing:true } } return { ...task, editing:false }; }) }) }
En que momento del curso cambiaron la lógica del metodo updateTask()
Me preguntaba lo mismo!! Me devolví a varios videos y nunca mostró
en algun momento dijo q estaba deprecado, asi que lo dejare con update y no agregare ese mutate
Si google keep deja que yo edite las tareas completadas, voy a hacer lo mismo jaja
La Versión de Angular 17, ya no tiene el metodo mutate sino el metodo update,
const count = signal(0); // Increment the count by 1. count.update(value => value + 1);
Gracias por el aporte!
gracias
me perdi con este video al ver tantos cambios en la logica. Hice el cambio en updateTask de update a mutate y me da error, lo deje con update y en la aplicacion no se ejecuta la opcion de modificar la tarea...
En que momento cambio tanto el código , se ve en el código que no usa update, sino que usa mutate eso no fue explicado ? updateTask tenia una lógica y ahora tiene otra, ademas si es una propiedad opcional debería ser [class.editing]="task?.editing" sino esto generará problemas
Esta opción en principio ¿actualiza siempre la tarea? Investigue para que este la opción de aceptar con enter o cancelar con escape y como usamos el KeyboardEvent para detectar una tecla pulsada le pase un tercer parametro de modo que en updateTaskText usar un if para que al pulsar enter haga text = input.value pero si la tecla pulsada es escape solo hacer editing:false de modo de recuperar la tarea original ¿Eso esta bien o hay otra forma de hacerlo?
Tu forma está bien, sin embargo, también puedes leer la tecla esc y ejecutar una función para ese comportamiento, ejemplo:
<input class="edit" [formControl]="input" (keyup.enter)="update()" (keyup.esc)="escape()" />
Me gustaría saber por qué tiene un mutate ahí y no mostró como lo incorporó
El mutate se utiliza para ejecutar la mutación en Apollo Client y realizar el registro del usuario en la base de datos. No se muestra cómo se incorpora porque no está incluido en el fragmento de código proporcionado en la transcripción.
Hola, no te preocupes el método mutate ya no se usa dentro de signals solo el método update por eso se salto esa parte!
updateTask(index: number, newValue?: Event) { const inputElement = newValue?.target as HTMLInputElement; const newTitleValue = inputElement?.value.trim(); console.log(newTitleValue); this.tasks.update((currentTasks) => { return currentTasks.map((task, i) => { if (index === i) { return { ...task, editing: !task.editing, title: newTitleValue || task.title, }; } return {...task, editing: false}; }); }); }
Esta fue la manera en que lo hice, con una sola funcion entro al modo edicion y salgo
¿Por qué no se hizo uso de un controlador también para el \<input> del modo edición?
En este caso crear el input de editMode como un FormControl implica que deberiamos crear un Control por cada input puesto que cada tarea tendría su propio FormControl, entonces se hace más practico hacerlo con el método, sin embargo esta técnica de varios FormControls si es un técnica para forms más complejos y son los FormsArrays.
Cuando le doy enter guarda el título pero no cambia la clase de el input
Saben por qué puede ser?
revise que en la funcion del .ts estes cambiando el editing a false
@for (task of tasks(); track task.id) { <li [class.completed]="task.completed" [class.editing]="task.editing" (dblclick)="editTask(task.id)" > <div class="view"> <input class="toggle" type="checkbox" [class.checked]="task.completed" (click)="toggleChecked(task.id)" /> <label>{{ task.title }}</label> <button class="destroy" (click)="deletetask(task.id)"></button> </div> <input class="edit" [value]="task.title" (keydown.enter)="updateTask($event, task.id)" /> </li> } ```y este es mis eventos validando que cumpla las condiciones de no actualizar con espacios ```js editTask(id: number) { console.log(id); this.tasks.update((tasks) => tasks.map((task) => task.id === id ? { ...task, editing: true } : { ...task, editing: false } ) ); } updateTask(event: Event, id: number) { const newtitle = (event.target as HTMLInputElement).value; this.newTaskControl.setValue(newtitle); const isvalid = this.newTaskControl.valid; this.tasks.update((tasks) => tasks.map((task) => task.id === id ? { ...task, title: isvalid ? newtitle.trim() : task.title, editing: false, } : task ) ); }
Escribí el médoto de edición si usar map debido a que el objeto modificado tiene referencia en memoria.
//Modo de editar una tarea editingMode(index: any) { this.tasksList.update((currentList) => { //Con el index obtenemos la tarea a editar const editedTask = currentList[index]; //Modificamos su propiedad editing editedTask.editing = true; //editedTask tiene referencia en memoria //Devolvemos la lista actual con el objeto modificado. return currentList; }); } ```*//Modo de editar una tarea* editingMode(index: any) { *this*.tasksList.update((currentList) => { *//Con el index obtenemos la tarea a editar* const editedTask = currentList\[index]; *//Modificamos su propiedad editing* editedTask.editing = true; *//editedTask tiene referencia en memoria* *//Devolvemos la lista actual con el objeto modificado.* return currentList; }); }
al remplazar mutate por update el código no me esta funcionando, a alquien mas le paso esto y cómo lo pudo solucionar
Utilizando @for que provee el angular v19, genere las interacciones y mediante la inserción agregue la clase con su condicional.
Una validación para que dentro del input editable se pueda hacer dblclick, para seleccionar una palabra
if (this.tasks()[index]?.editing || this.tasks()[index]?.completed) return;
Esta es la forma en la que escribí el método updateTaskEditingMode:
updateTaskEditingMode(index: number){ this.tasks.update((tasks) => tasks.map((task, position) => { return {...task, editing: position === index ? true : false} })); } ``` updateTaskEditingMode(*index*: *number*){ this.tasks.update((*tasks*) *=>* *tasks*.map((*task*, *position*) *=>* { return {...*task*, editing: *position* === *index* ? true : false} })); }
Perdón, se me fue doble el código
updateTaskEditingMode(index: number){ this.tasks.update((tasks) => tasks.map((task, position) => { return {...task, editing: position === index ? true : false} })); } ``` updateTaskEditingMode(*index*: *number*){ this.tasks.update((*tasks*) *=>* *tasks*.map((*task*, *position*) *=>* { return {...*task*, editing: *position* === *index* ? true : false} })); }
Mi solución para evitar que se edite una tarea completada:
Adicionalmente, agregué una validación para evitar que se agregue texto vacío al editar.
No te sugiero que anides un if dentro de otro if, si estas usando la logica, en primera instancia tu solucion esta bien, si te llegas a trabar en alguna parte, recuerda siempre buscar en la documentacion, incluso preguntar al chatgpt te dejo otra solucion utilizando expresiones regulares desde el formControl
taskForm = new FormControl('', {nonNullable:true, validators:[Validators.required,Validators.pattern(/^\S+$/)] } )
// taskForm = new FormControl('', {nonNullable:true, validators:[Validators.required,Validators.pattern(/^\S+$/)] } )
punto interesante: Porque typescript no se queja de que enviamos una clave text, si la interfaz especifica que tiene que ser de Task, y Task no tiene esa clave?
Pues, resulta que typescript no valida cuando el mergeamos objetos con spread operator.
Si se utliza clave valor, typescript deberia quejarse.
Mi validación a que no pueda editar una tarea completada
public updateTaskText(index: number, event: Event) { const target = event.target as HTMLInputElement; const value = target.value.trim(); this.tasks.update((tasks) => { return tasks.map((task, position) => { if (position === index && task.complated === false) { return { ...task, title: value, editing: false }; } alert('Esta tarea ya fue completada'); return task; }); }); }