Like si tambien te gustaria un curso dedicado a RXJS.
Componentes
Todo lo que aprenderás sobre componentes y servicios en Angular
¿Qué son los componentes?
Uso de Inputs
Uso de Outputs
Componente para producto
Ciclo de vida de componentes
ngDestroy and SetInput
Lista de productos
Componentes y Header
Implementando el sideMenu
Comunicación padre e hijo
Servicios
Conociendo los servicios
¿Qué es la inyección de dependencias?
Obteniendo datos de una API
Pipes y Directives
Conociendo los pipes
Construyendo tu propio pipe
Conociendo las directivas
Best practices
Reactividad básica
Guia de estilos de Angular y linters
Despedida
Despedida
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
Paga en 4 cuotas sin intereses
Termina en:
Nicolas Molina
El concepto de reactividad básica es muy importante en el desarrollo front-end. Se trata del estado de la aplicación con respecto al valor de los datos en cada componente, cómo estos cambian a medida que el usuario interactúa y cómo se actualiza la interfaz.
Cuando pensamos en cómo comunicar un componente padre con su hijo y viceversa, solemos utilizar los decoradores @Input()
y @Output()
.
Pero muchas veces, en aplicaciones grandes, la comunicación de componentes se vuelve mucho más compleja y estas herramientas no alcanzan cuando se necesita enviar información de un componente “hijo” a uno “abuelo”.
Es recomendable implementar un patrón de diseño para mantener el estado de la aplicación centralizado en un único punto, para que todos los componentes accedan a ellos siempre que necesiten. A este punto central se lo conoce como Store.
{height="" width=""}
Los store de datos suelen implementarse haciendo uso de Observables.
Paso 1:
Importa la clase BehaviorSubject
desde la librería RxJS
, que te ayudará a crear una propiedad observable, a la cual tu componente pueda suscribirse y reaccionar ante ese cambio de estado.
// services/store.service.ts
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class StoreService {
private myShoppingCart: Producto[] = [];
private myCart = new BehaviorSubject<Producto[]>([]);
public myCart$ = this.myCart.asObservable();
constructor() { }
addProducto(producto: Producto): void {
// El observable emitirá un nuevo valor con cada producto que se agregue al carrito.
this.myShoppingCart.push(producto);
this.myCart.next(this.myShoppingCart);
}
}
Paso 2: Suscribe a cualquier componente que necesites a estos datos, para reaccionar cuando estos cambian.
// components/nav-bar/nav-bar.component.ts
import { StoreService } from 'src/app/services/store.service';
import { Subscription } from 'rxjs';
@Component({
selector: 'app-nav-bar',
templateUrl: './nav-bar.component.html',
styleUrls: ['./nav-bar.component.scss']
})
export class NavBarComponent implements OnInit, OnDestroy {
private sub$!: Subscription;
constructor(
private storeService: StoreService
) { }
ngOnInit(): void {
this.storeService.myCart$
.subscribe(data => {
// Cada vez que el observable emita un valor, se ejecutará este código
console.log(data);
});
}
ngOnDestroy(): void {
this.sub$.unsubscribe();
}
}
El lugar más apropiado para esto es en ngOnInit()
. No olvides guardar este observable en una propiedad del tipo Subscription
para hacer un unsubscribe()
cuando el componente sea destruido.
NOTA: Por convención, las propiedades que guardan observables suelen tener un “$” al final del nombre para indicar que se trata de un observable.
Ver código fuente del proyecto
Contribución creada con los aportes de Kevin Fiorentino.
Aportes 47
Preguntas 11
Like si tambien te gustaria un curso dedicado a RXJS.
Excelente video, me pareció simplemente genial como Nicolas explica la reactividad, además agradezco que lo hayan incluido ya que es un tema importante, me encantaría ver un curso completo acerca de reactividad para Angular.
Expresa tu apoyo con un me gusta si estas de acuerdo.
Un like si apoyan mi comentario de que haya un curso de Rxjs y ngRx.
Coincido con los comentarios, hace falta un curso especifico de Rxjs en Angular
Es un tema súper importante y merece un curso propio. Tengo la duda de cómo evitar que el contador reinicie cuando el usuario refresca la pantalla? Que opciones hay? Es una buena practica usar LocalStorage?
También todo mi apoyo para un curso de reactividad con RxJS y NGRx en Angular.
Algo super importante cuando existen subscripciones a observables que no son de http o de route (que por sí mismas se destruyen), es que debemos manejar su destrucción del componente. Esto porque puede generar un memory leak.
Yo creé un método que realizara la suscripción y la retornara para manejarla.
getMyCartLength(): Subscription {
return this._storeService.myCart$
.subscribe(products => {
this.counter = products.length;
});
}
Y dentro del onInit()
la almaceno en una variable o arreglo (en caso que deba manejar más de una subscripción a observables) de tipo Subscription
. Ej:
ngOnInit(): void {
// Si se tendrán más subscripciones
this.subscriptions = [
this.getMyCartLength()
]
// Manejar una sola subscripción
this.subscription = this.getMyCartLength()
}
Todo esto, para que cuando el componente de desmonte, y se ejecute el método onDestroy()
del ciclo de vida. También destruya las subscripciones que tiene activas.
ngOnDestroy(): void {
// Si se tendrán más subscripciones
this.subscriptions.forEach(sub => {
if (sub !== null) {
sub.unsubscribe()
}
});
// Manejar una sola subscripción
this.subscription ? this.subscription.unsubscribe() : null;
}
Seria super bueno que indicaran como se utlizan los test de cada proceso
Quiero un curso de RXJS para Angular
Programación Reactiva
La programación reactiva sigue el patrón de diseño Observer; cuando hay un cambio de estado en un objeto, los otros objetos son notificados y actualizados acorde.
Entender esta parte de reactividad ha hecho que haga un refactoring impresionante a mis proyectos, que excelente curso el del profe !
Ya entendi porque sentia que me costaba un poco mas entender React que otros frameworks o librerias.
Estilos que les pueden servir para su contador
.shopping-cart-container {
position: relative;
display: block;
.counter {
position: absolute;
right: -12px;
top: -4px;
color: #fefefe;
font-size: 12px;
width: 20px;
height: 20px;
border-radius: 50%;
text-align: center;
line-height: 20px;
background-color: #458f4b;
}
}
apoyo la idea de que se hagan una serie de cursos sobre rxjs y reactividad en angular
Muy buena explicación. El manejo de estado mediante un servicio nos quita de varias cosas como la comunicación que tendríamos que desarrollar para hacerlo por medio de inputs y outputs. Me gustaría saber su opinión de NGRX, aún se sigue usando o realmente hay mejores herramientas para mejorar el estado?
Tengo una gran pregunta, en foros he visto que al utilizar asObservable elimina la implementación del Observador(Observer). Por lo tanto, no puede llamar a next, error & complete en la instancia devuelta por asObservable().
que en typescriipt seria mejor hacer esto:
private messageSubject = new BehaviorSubject<any>(undefined);
public messages$: Observable<any> = this.messageSubject;
Que bonito es lo bonito 😃
Es la 5ta vez que me veo este video. Jajajaja, el impostor me está atacando!
Like si también quieres un curso sobre Akita state management con Angular Está construido sobre RxJS e inspirado en modelos como Flux y Redux. La integración de Akita es más simple que NgRx y NgXs.
Ahi tenes Curso de RxJs
Excelente la explicación de la reactivada con RxJS para Angular y también apoyo que haya un curso de reactivadad con RxJS y NGRx en Angular.
Un curso de RxJS y ngRx please!!!
crazy los observables 🖖
Realicé un post hace un tiempo en dónde trato de hacer mi mayor esfuerzo para explicar sobre este tema, me agradaría mucho que quién pueda verlo, lo lea.
…
Espero que les pueda alimentar el conocimiento
estado global usando servicios y rxjs
este es un video al que he vuelto mas de una vez para seguir profundizando en angular
Con esta opción pueden crear el circulo para la numeración del carrito de compras.
span.red{
background: red;
border-radius: 0.8em;
-moz-border-radius: 0.8em;
-webkit-border-radius: 0.8em;
color: #ffffff;
display: inline-block;
font-weight: bold;
line-height: 1.2em;
margin-right: 15px;
text-align: center;
width: 1.2em;
}
Excelente clase. Hace falta un cursito de RXJS y de NGRX para completar la carrera de Desarrollador Angular
pongan un cursp de rxjs
🤯Increíble y realmente se parece mucho a redux 😅
rxjs es lo mismo qué Ngrx??
Angular es Fascinante… me convenció totalmente, me encanta el orden, me encanta lo sencillo de su implementación, y realmente no parece ser una curva de aprendizaje, compleja, jeje o bueno es que Nico hace un gran trabajo como dicente, entrega muy muy bien el conocimiento. felicitaciones
Explicación magistral! Muchas gracias Nico!!
Este manejo de estado me recuerda muchisimo al useContext de React
En manejo del estado me gusta mucho mas del modo en que se hace en Angular a diferencia de como se tiene que hacer en React, aunque en React me encanta la manera tan facil y practica de comunicar componentes entre si, es una sintaxis mas limpia.
Tenia que decirlo 😄, Me encantan las 2 librerias
Excelente clase, super interesante esta alternativa para comunicación entre componentes!
Mi aporte por si los productos son mas de nueve
<div class="cart">
<img src="./assets/icons/icon_shopping_cart.svg" alt="logo">
<span class="span-cart" *ngIf="counter > 9; else lessLength">+9</span>
<ng-template #lessLength>
<span class="span-cart" >{{counter}}</span>
</ng-template>
</div>
Si alguien tiene alguna duda de donde el myCart$ saca los productos, es en el servicio al momento de hacer esto
this.myCart.next(this.myShoppingCart);
}
se le da la referencia a la lista de productos.
hace falta en curso de ngRX
Super esta clase me gusto poder aplicar Store, poder realizar comunicación entre los componentes y sin tener que estar en input y output 😁
Curso rxjs en platzi:
https://platzi.com/cursos/programacion-reactiva-rxjs/
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?