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

Update Tasks

13/71
Recursos

Aportes 22

Preguntas 1

Ordenar por:

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

Desconocía esa forma de hacer debugging.

Les paso algo mas simple de hacer:

<input class="toggle" type="checkbox" [checked]="task.completed" (change)="updateTask(task)" />

y en la action:

updateTask(task: Task) {
    task.completed = !task.completed;
  }

Debe de ser una gran coincidencia que el código del profesor se parezca al mio 😅

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);  } ```js countCompletedTasks() { return this.tasks().reduce((pv, cv) => !cv.completed ? pv + 1 : pv, 0); } {{countCompletedTasks()}} item left ```
un poquito mas directo :D ![](https://static.platzi.com/media/user_upload/image-9cdd8f04-20fc-4a58-b4eb-1f5b96077cef.jpg)
en vue lo hacia asi pero luego vi que rompe el principio de la inmutacion jaja \<input *class*="toggle" *type*="checkbox" *\[checked]*="!task.completed"/>
Que hermosa forma de debugear
**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. `Object.assign({}, data, { attribute: 'something' }` ### Operador spread Este fue el operador que utilizo el profesor en la clase. `{...data, attribute: 'something' }` Aquí más información: [¿Qué es Inmutabilidad en JavaScript? (freecodecamp.org)](https://www.freecodecamp.org/espanol/news/que-es-inmutabilidad-en-javascript/)
muy bueno angular, mirando las nueva versión haber que mejoras tiene
![](https://static.platzi.com/media/user_upload/image-d54554cf-b99e-4dfe-a266-55b390d990e6.jpg)
esta fe mi solución no se si ahi sobra el evento ![](https://static.platzi.com/media/user_upload/image-1ba93868-ec1b-44e0-8dda-af792d44bc85.jpg)
updateTask = () => { *this*.tasks().filter((tasks) => tasks.isCompleted = !tasks.isCompleted) }
Tengo un problema en el método updateTask en la línea return this.task.map Me indica que no reconoce map Que me falta adiciona? Adicionalmente para que no me marque error en los parámetros me todo dejar (task: Task, position: number) Para que no me solicite el tipo que debo hacer? Muchas gracias a todos. tengo poca expediencia en Angular.
Mi solución es un poco distinta aprovechando como se controla la inmutabilidad en Redux ```ts completedTask(index: number): void { const TASK: iTask = {...this.tasks()[index]} TASK.completed = !TASK.completed this.updateTask(TASK) } private updateTask(updateTask: iTask): void { this.tasks.update(tasks => tasks.map(task => task.id === updateTask.id ? updateTask : task)) } ``` completedTask(index: number): void { const TASK: iTask = {...this.tasks()\[index]} TASK.completed = !TASK.completed this.updateTask(TASK) } private updateTask(updateTask: iTask): void { this.tasks.update(tasks => tasks.map(task => task.id === updateTask.id ? {...updateTask} : task)) }

Yo lo había resulto así ¿está mal?:

changeState(task:Task){
    task.completed = !task.completed
    console.log(`EL ESTADO ES: ${task.completed}`);
  }
Por abstraccion, prefiero actualizar el atributo completed con el valor checked del input, algo asi: ```js <input class="toggle" type="checkbox" [checked]="task.completed" (change)="updateTask(i, $event)" /> ``` ```js updateTask(index: number, event: Event) { const checkbox = event.target as HTMLInputElement; this.tasks.update( (tasks) => { return tasks.map( (task, position) => { if (position === index) { return { ...task, completed: checkbox.checked // <= valor real del checkbox } } return task; } ) // map end } // update arrow function parameter end ); // update end } ```
```js updateTask(index: number) { this.tasks.update(tasks => { tasks[index] && ( tasks[index].completed = !tasks[index].completed ) return tasks }) } ```
```js changeHandlerStatus(event: Event, index: number) { const checkbox = event.target as HTMLInputElement; const checked = checkbox.checked; this.tasks.update(tasks => { const task = tasks[index]; return [ ...tasks.slice(0, index), { ...task, completed: checked }, ...tasks.slice(index + 1) ]; }); } ```
```js updateTask(index: number) { this.tasks.update(tasks => { const task = tasks[index]; return [ ...tasks.slice(0, index), { ...task, title: 'updated task' }, ...tasks.slice(index + 1) ]; }); } ```
Creo que estaría mejor actualizar y borrar en base al id de cada task, y no con el index, para tener más consistencia en el código.

✅

Si actualmente tengo una aplicación reactiva usando behaviorSubject, el uso de signals seria un complemento o una forma de reemplazar la clase Rxjs si mi intencion es mejorar el performance de la aplicacion