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. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

15 Días
2 Hrs
16 Min
29 Seg

Usando effect para localStorage

22/71
Recursos

Aportes 14

Preguntas 2

Ordenar por:

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

mejor el footer así: \<footer class="footer" \*ngIf="tasks().length > 0"> esto evita que desaparazca cuanto tengo cero completados y de casualidad voy al filtro de completados..
a mi me funciona bien sin necesidad del inyector, por favor ¿alguién que me pueda decir el por que? ```js ngOnInit() { const storageTasks = localStorage.getItem('tasks'); if(storageTasks) { const tasks: Task[] = JSON.parse(storageTasks); this.tasks.set(tasks); } } constructor() { effect(() => { localStorage.setItem('tasks', JSON.stringify(this.tasks())); }); } ```ngOnInit() { const storageTasks = localStorage.getItem('tasks'); if(storageTasks) { const tasks: Task\[] = JSON.parse(storageTasks); this.tasks.set(tasks); } } constructor() { effect(() => { localStorage.setItem('tasks', JSON.stringify(this.tasks())); }); }
Para entender la inyección de dependencias tengan en cuenta que en angular una dependencia es un servicio, un valor, una función o cualquier parte lógica que una clase/componente necesita para funcionar correctamente. * Por defecto, debemos instanciar o declarar estas dependencias en el constructor. En el ciclo de vida de angular primero se ejecuta el constructor y después el onInit. Por lo tanto el effect guarda el valor inicial de las tareas que es un array vacío. * Para cambiar el orden de renderizado de una dependecia angular tiene los inject que te da la libertad de inyectar/agregar una funcionalidad a tu código en algún punto que tu desees. * Para hacer traking de un estado angular requiere que declaremos el effect en el constructor de esta manera estará escuchando todo el tiempo que el componente este activo el estado de esa variable. * Si no lo inyectamos en el constructor el effect no estará en modo de escucha y no puede detectar cambios en la variable objetivo. * Para declararlo fuera del constructor debemos inyectar todas las dependencias que requiera al momento de declararlo, eso es lo que indica este parámetro  {injector: this.injector} * De manera breve lo que se hace es crear el effect fuera del constructor y después agregarle todas las librerías, lógica y demás al memento de crearlo para que funcione de manera adecuada. * Esta librería esta en construcción supongo que la van a modificar para hacerla mas entendible en proximas versiones, algo mas parecida al useEffect de react que es mas simple de útilizar y cumple la misma función.
De esta manera no toco agregar nada mas: `  constructor() {    effect(() => {      localStorage.setItem('tasks', JSON.stringify(this.tasks()))    })  }` `  ngOnInit() {    const storage = localStorage.getItem('tasks');    if (storage) {      this.tasks.set(JSON.parse(storage))    }  }`

Fuente: ChatGPT.
En Angular 17, usar { injector: this.injector } en la función effect asegura que el efecto tenga el contexto correcto del inyector de dependencias del componente. Esto es necesario para resolver correctamente las dependencias y servicios usados en el efecto, y para gestionar de manera adecuada el ámbito y ciclo de vida del efecto en relación con el componente. Es una práctica recomendada para mantener la integridad y coherencia del manejo de estados y dependencias en el componente.

mi constructor estaba justo despues del inicio de la clase.. y nunca tuve problemas ... no me tocó hacer nada mas para que no se borraran los datos
No entiendo bien que hacen estas lineas. injector = inject(Injector) {injector: this.injector}
a mi me funciona bien sin necesidad del inyector, por favor ¿alguién que me pueda decir el por que? ```js export class HomeComponent implements OnInit { ngOnInit() { const storageTasks = localStorage.getItem('tasks'); if(storageTasks) { const tasks: Task[] = JSON.parse(storageTasks); this.tasks.set(tasks); } } constructor() { effect(() => { localStorage.setItem('tasks', JSON.stringify(this.tasks())); }); } ```export class HomeComponent implements OnInit { ngOnInit() { const storageTasks = localStorage.getItem('tasks'); if(storageTasks) { const tasks: Task\[] = JSON.parse(storageTasks); this.tasks.set(tasks); } } constructor() { effect(() => { localStorage.setItem('tasks', JSON.stringify(this.tasks())); }); }
tampoco tuve necesidad de usar el inject
Tuve un error en consola: "Error parsing tasks from localStorage: SyntaxError: "undefined" is not valid JSON at JSON.parse (\<anonymous>)" Así es como lo solucioné: ```ts ngOnInit() { const storage = localStorage.getItem('tasks'); if (storage && storage !== 'undefined') { try { const tasks = JSON.parse(storage); this.tasks.set(tasks); } catch (error) { console.error('Error parsing tasks from localStorage:', error); } } this.trackTasks(); } ```
Por alguna razón no me funcionaba el ngOnInit() cuando recargaba la página, solo cuando corrría el npm run start. Lo Solucione quitando el cache en la ventana de networking ![](https://static.platzi.com/media/user_upload/image-247deb57-f4d7-46c6-a210-95806fb649f4.jpg) Tambien no me funcionaba el código del profe porque empezaba con un localstorage que me entregaba null. Lo resolví de la siguiente manera `injector = inject(Injector);` `  ngOnInit() {    console.log('ng om init');` `    const storage = localStorage.getItem('tasks');    console.log(storage)    if ( storage !== null ) {      const tasks = JSON.parse(storage);      this.tasks.set(tasks);    }    this.trackTasks();  }` `  trackTasks() {    console.log("Setting up trackTasks effect");    effect(() => {      const tasks = this.tasks();      console.log(tasks);      localStorage.setItem('tasks', JSON.stringify(tasks));      console.log(localStorage.getItem('tasks'));` `    }, { injector: this.injector });  }` ![](https://static.platzi.com/media/user_upload/image-3ace170f-0f88-4e89-9077-51dd410d7888.jpg)

Opté por colocar la lógica de ‘effect’ en el constructor en lugar de ngOnInit porque ‘effect’ es una función sincrónica. En Angular, el constructor es un buen lugar para inicializar propiedades y ejecutar lógica que no depende de servicios externos o datos asíncronos. Además, reservo ngOnInit para actividades que involucran operaciones asíncronas o dependencias externas.

constructor() {
  const storage = window.localStorage.getItem('tasks');
  if (storage) {
    const tasks = JSON.parse(storage);
    this.tasks.set(tasks);
  }
  this.updateLocalStorage();
}

Créditos a ChatGPT 🤖

✅

Muy buen curso. Gracias profesor Nicolás. ngrx/store es un tema que me ha costado dominar. Esto del efect es similar a ngrx/store? Puede reemplazr a ngrx/store? O definitivamente es lo mismo pero en menor escala? Agradezco sus aclaraciones.