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

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
15 Hrs
17 Min
36 Seg

Estados compuestos con computed

21/71
Recursos

Aportes 20

Preguntas 2

Ordenar por:

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

Me gusta mas la solución usando enums, te dan mayor flexibilidad a la hora de condicionar ya que con los enums podríamos crear un mapa de opciones para retornar por cada condición. A su vez al usar mapas se pueden ejecutar funciones dinámicas por cada opción ![](https://static.platzi.com/media/user_upload/image-6bb190b7-2691-44be-b5e3-72db7a5201c2.jpg) ![](https://static.platzi.com/media/user_upload/image-eb4d1fb9-1af9-46c9-b624-e979560aae21.jpg)
Si han seguido el curso hasta aqui, no olviden cambiar en los metodos el index por el id, al igual que el parametro que envian por task.id Porque como anteriormente se enviaba el index; si le dan completed a la tarea que se encuentra en el index 1 y luego filtran por completed y le dan eliminar, este va eliminar el indice 0 eliminando asi un elemento diferente. deleteTask(*id*: number){    this.tasks.update((*tasks*) => *tasks*.filter((*task*) => *task*.id !== *id*))  } ```js <button class="destroy" (click)="deleteTask(task.id)"></button> deleteTask(id: number){ this.tasks.update((tasks) => tasks.filter((task) => task.id !== id)) } ```
Para no complicarme mucho con la parte de un Enum, utilicé un type de la siguiente manera: ![](https://static.platzi.com/media/user_upload/image-a4222774-1e1a-4462-8d37-8f0c9400a732.jpg)
mi solución sería esta: ![](https://static.platzi.com/media/user_upload/image-5e5ed72d-9c3a-4edf-bd7a-019cda976c8d.jpg)
Acá m solución al reto de la clase. Saludos! ![](https://static.platzi.com/media/user_upload/image-206f8079-49b6-4949-b97a-982258bd39bf.jpg)
Esto la función computed me recuerda un poco a useMemo de react. Adicional los computed signals son evaluadas de manera perezosa y memorizadas, estas solo calculan su valor al ser accedidas por primera vez y lo almacenan para usos futuros. Cuando sus dependencias cambian, invalidan la caché, recalculando el valor solo cuando son accedidas de nuevo.
Creo el estado de los filtro: ![](https://static.platzi.com/media/user_upload/image-d32b7ecb-98e4-4ac0-bc98-5cc98a3b3953.jpg) Estados computados ![](https://static.platzi.com/media/user_upload/image-c210393a-bf74-4574-bb54-66bf81cd0cf5.jpg) el handler ![](https://static.platzi.com/media/user_upload/image-9507d196-0011-4527-bd07-47133daeaeab.jpg) Cambios en el template ![](https://static.platzi.com/media/user_upload/image-3770e00d-9a4b-4710-83d8-0e42e6ec6ca5.jpg) retos: ![](https://static.platzi.com/media/user_upload/image-86228f23-f6b6-4d65-acc6-86d5bda786c0.jpg) ![](https://static.platzi.com/media/user_upload/image-edb3ca3c-390a-4ba3-ae23-12edb9aef87c.jpg)
Yo no se si tome la ruta fácil pero se me ocurrió usar el Signal filter para hacer lo de la clase dinámica aun creo que si tuviera muchos tipos de filtre seria tedioso cambiarlos todos![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-09-02%20a%20la%28s%29%2011.22.52p.m.-3adcca9a-234c-4868-bf70-791579e70139.jpg)
Aquí mi solución ![](https://static.platzi.com/media/user_upload/image-b1659281-7f73-4eab-8d4a-8e35091dbaa8.jpg) ![](https://static.platzi.com/media/user_upload/image-6b0aac90-066b-4cad-93de-73ad280a073c.jpg)
esta es la solución para que la cantidad de items cambie de acuerdo a los filtros, en mi caso estoy utilizando players porque lo cambié por task, en dado caso solo deben de cambiar players por task. ```js {{ playersByFilter().length }} Player <ng-template #elseBlock> Players </ng-template> ```\        \{{ playersByFilter().length }}\        \Player\</span        >        \<ng-template #elseBlock> Players \</ng-template>      \ Aquí esta la solucion al cambio de los campos, con ayuda de los comentarios:  ```js ```
La solución a mi reto fue el siguiente ```ts <footer class="footer"> {{ taskByFilter().length }} items <ng-template #elseBlock> item </ng-template> <button class="clear-completed">Clear completed</button> </footer> ```
En mi caso solucione el tema del footer de la siguiente forma: ![](https://static.platzi.com/media/user_upload/image-3a3ed0b3-7413-4b14-b511-24be87a23843.jpg)![](https://static.platzi.com/media/user_upload/image-3221aaf9-4b0a-41d4-a4cc-bb19894ad02a.jpg) me funcionó, pero a la hora de las buenas practicas de programación no se si esta bien aplicado, me gustaria mucho que dejarán sus opiniones, graciasss :D
Hola. Porqué los recursos sólo tienen hasta el branch step-18? Gracias.
![](https://static.platzi.com/media/user_upload/image-90f0dec6-43de-48d0-b2fc-0d31da4cfd15.jpg)
Con esto se podria usar el patron de diseño estrategy no? Cuando termine esta parte del curso vere si puedo haerlo todo por objetos al back jeje
Aquí está mi aporte (Quedo atento a cualquier sugerencia):      \        \{{tasksLength}}\ items      \      \<ng-template #justItem>        \          \{{tasksLength}}\          item\      \</ng-template> ***Home.component.ts*** ```js tasksLength = this.tasks().length; if(filter === 'pending'){ this.tasksLength = tasks.filter(task => !task.completed ).length; return tasks.filter(task => !task.completed ) } if(filter === 'completed'){ this.tasksLength = tasks.filter(task => task.completed ).length; return tasks.filter(task => task.completed ) } this.tasksLength = this.tasks().length; return tasks; ```Home.component.html ```js {{tasksLength}} items <ng-template #justItem> {{tasksLength}} item </ng-template> ```
Porque hay que usar computed?, me funciona sin usarlo. ```js taskByFilter=(()=>{ const filter=this.filter(); const tasks= this.tasks(); if (filter==="pending"){ return tasks.filter(task=>!task.completed); } if (filter==="completed"){ return tasks.filter(task=>task.completed); } return tasks; }); ```

✅

Como la opcion selecionada de los filtros debe ser una sola y estar marcada ¿no es mejor un radio button o un combo? En ese caso ¿no podria usarse el texto de la opcion seleccionada? Ya no habria que validar el texto porque no se ingresaria a mano

Por aquí dejo mi solución al reto 😄
Este sería para la cantidad de tareas, en base a cada filtro.

<strong>{{ tasksByFilter().length }}</strong>

Y este sería para mostrar el los estilos de la clase ‘selected’ en base al filtro en donde se encuentra

<a [class.selected]="filter() === 'all'" (click)="changeFilter('all')"
  >All</a
>