Introducción a Angular y Fundamentos

1

Aprende Angular 17

2

Creando tu primer proyecto en Angular

3

Implementando estilos

4

Mostrando elementos

5

Property Binding en Angular

6

Event Binding: click y doble click

7

Event binding: keydown

8

Modelo de reactividad con Signals

9

Creando un Signal en Angular

Estructuras de control en Angular

10

Directivas de control

11

Uso de ngFor

12

ngFor para objetos

13

Update Tasks

14

Uso de ngIf

15

Uso de ngSwitch y ngSwitchDefault

16

Controlando un input

17

Manejo de formularios en Angular

Alistando tu aplicación para producción

18

Estilos al modo Angular

19

Clases en Angular

20

Editing mode

21

Estados compuestos con computed

22

Usando effect para localStorage

23

Uso de ngbuild

24

Despliegue con Firebase Hosting

25

Nueva sintaxis en Angular

26

Directivas @For, @switch

27

Migrando a la nueva sintaxis de Angular v17

Componentes Reutilizables y Comunicación

28

Construyendo un e-commerce en Angular

29

Componentes en Angular

30

Mostrando los componentes

31

Angular DevTools

32

Uso de Inputs en Angular

33

Uso de Outputs en Angular

34

Componentes para Producto

Ciclo de vida de los componentes

35

Ciclo de vida de componentes

36

Ciclo de vida de componentes: ngOnChanges

37

Ciclo de vida de componentes: ngOnInit

38

Detectando cambios en los inputs

39

Evitando memory leaks con ngDestroy

40

Audio player con ngAfterViewInit

41

Creando la página "about us" o "conócenos"

Mejorando la interfaz del producto

42

Creando componente de productos

43

Creando el Header

44

Creando el carrito de compras

45

Comunicación padre e hijo

46

Calculando el total con ngOnChanges

47

El problema del prop drilling

48

Reactividad con signals en servicios

49

Entendiendo la inyección de dependencias

Integración y Datos

50

Obteniendo datos una REST API

51

Importaciones cortas en Typescript

52

Pipes en Angular

53

Construyendo tu propio pipe

54

Utilizando librerías de JavaScript en Angular

55

Conociendo las directivas

56

Deployando un proyecto en Vercel

Enrutamiento y Navegación

57

Ruta 404

58

Uso del RouterLink

59

Vistas anidadas

60

Uso del RouterLinkActive

61

Detalle de cada producto

62

Obteniendo datos del producto

63

Galería de imagenes

64

Detalle de la galería

Perfeccionando tu e-commerce

65

Mostrando categorias desde la API

66

Url Params

67

LazyLoading y Code Splitting

68

Aplicando LazyLoading

69

Prefetching

70

Usando la nueva sintaxis de Angular 17

71

Lanzando tu aplicación a producción

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

18 Días
7 Hrs
24 Min
5 Seg

Editing mode

20/71
Recursos

Aportes 25

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La modificación para que no permita editar tareas ya completadas.

En que momento del curso cambiaron la lógica del metodo updateTask()

La Versión de Angular 17, ya no tiene el metodo mutate sino el metodo update,

Writable signals

const count = signal(0);

// Increment the count by 1.
count.update(value => value + 1);

Si google keep deja que yo edite las tareas completadas, voy a hacer lo mismo jaja

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

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...
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: ```js 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: ![](https://static.platzi.com/media/user_upload/image-7199820b-fc63-4e76-9a84-27c7ff9b4505.jpg) Adicionalmente, agregué una validación para evitar que se agregue texto vacío al editar. ![](https://static.platzi.com/media/user_upload/image-fdecadbe-385d-4607-bf2d-9726e7f3f82e.jpg)
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 ```ts 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; }); }); } ```
Mi solución al reto ```ts public updateTaskEditingMode(index: number) { this.tasks.update((tasks) => { return tasks.map((task, position) => { task.editing = false; if (position === index) { return { ...task, editing: true }; } return task; }); }); } ```
```js updateEditing(index: number){ this.tasks.update(prevState => { return prevState.map((task, position) => { if (position == index && !task.completed){ return { ...task, editing: true }} return { ...task, editing: false } })})} ```Así hice para que no se puedan editar tareas completadas
![](https://static.platzi.com/media/user_upload/code-33d562a1-2699-41be-b352-cc3fb0c5c756.jpg)Una solucion simple pero solucion a fin de cuentas
![](https://static.platzi.com/media/user_upload/image-018d0a84-53de-4e33-bf74-4f6178215bbe.jpg)
No sé que tan buena idea sea hacerlo de esta manera, de alguna forma se me hizo más simple, y evita iterar innecesariamente todos los elementos, aún así dudo que esto sea buena práctica. ![](https://static.platzi.com/media/user_upload/image-dc292be5-68d4-426e-8a8c-80fd5a2b346e.jpg)
mi solución para no modificar las tareas completadas:updateTaskEditingMode(index:number){    *this*.tasks.update(prevState=> {      return  prevState.map((task,i)=>{        if(i===index && !task.completed){          return {            ...task,            editing: !task.editing          }        }        *//las demas por defecto deben estar en editing mode false*        return {          ...task,          editing: false        };      });    });  } ```js updateTaskEditingMode(index:number){ this.tasks.update(prevState=> { return prevState.map((task,i)=>{ if(i===index && !task.completed){ return { ...task, editing: !task.editing } } //las demas por defecto deben estar en editing mode false return { ...task, editing: false }; }); }); } ```
Nicolás me perdí, en que momento cambio el método updateTask, al cambiar el método se daña todo!! Colocó el mutable y también me marca error.
```js editingTaskMode(index: number, isEditingMode: boolean = true) { if (!isEditingMode) { this.tasks.update(tasks => { tasks[index] && (tasks[index].editing = false) return tasks }) return } this.tasks.update(prevTasks => ( prevTasks.map((task, position) => ({ ...task, editing: position === index })) )) } updateTask(index: number, event: Event) { const titleTask = (event.target as HTMLInputElement).value.trim() titleTask && ( this.tasks.update(tasks => { if (tasks[index]) { tasks[index].title = titleTask tasks[index].editing = false } return tasks }) ) } ``` ```js <input class="edit" [value]="task.title" (keydown.enter)="updateTask($index, $event)" (keydown.escape)="editingTaskMode($index, false)" /> ```
usando un control para la edicion puede quedar de esta forma ```js <input class="edit" [formControl]="editTaskCtrl" (keyup.enter)="onEndEditTask()" (keyup.esc)="escapeEditTask()" /> ``` ```js editTaskCtrl = new FormControl('', {nonNullable: true, validators: [ Validators.required, Validators.pattern('^\\S.*$'), Validators.minLength(3) ]}); onStartEditTask(index: number) { // no se pueden editar las ya completadas if(this.tasks()[index].completed) return; // iniciar modo de edición this.tasks.update( (tasks) => tasks.map( (task, position) => { if(position === index){ this.editTaskCtrl.setValue(task.title); task.editing = true; } else { task.editing = false; } return task; } ) ); } onEndEditTask() { const title = this.editTaskCtrl.value.trim(); if (this.editTaskCtrl.valid && title.length > 0) { this.tasks.update((tasks) => tasks.map( (task, position) => { if (task.editing === true) { task.title = title task.editing = false } return task; } )); } } escapeEditTask() { this.tasks.update( (tasks) => tasks.map( (task, position) => { task.editing = false; return task; } ) ); } ```

Evitar bloques de código: ![](https://static.platzi.com/media/user_upload/image-d13339be-a5a6-4c75-8f95-d4904c6f6487.jpg)
Hubiera estado genial si en la función edición hubieramos agregado una flag para "isEditingMode" = false para dar soporte adicional al evento "keydown.escape" para salir del modo de edición y cancelar cualquier valor no confirmado. ![](https://static.platzi.com/media/user_upload/image-d09703d6-c806-42f6-9acc-2bc6ab5323d4.jpg)

Validation to not allow an already completed task to be edited

<updateTaskEditingMode( index: number ) {
    this.tasks.update(( tasks ) => tasks.map(( task, position ) => {
      if ( position === index && !task.completed ) {
        return {
          ...task,
          editing: true
        }
      }
      return {
        ...task,
        editing: false
      }
    }));
  }
> 
Mi solución para evitar que se editen las tareas completadas y además se evite mostrar el input de edición: ```js
  • <input class="toggle" type="checkbox" [checked]="task.completed" (change)="completeTask(task.id)" /> <label>{{task.title}}</label> <button class="destroy" (click)="deleteTask(task.id)"></button>
    <input class="edit" [value]="task.title" (keydown.enter)="updateTask($event, task.id)"/>
  • ```