Lectura de Parámetros URL en Angular para Filtrado y Navegación
Resumen
Una característica sobre las URL es la posibilidad de transportar información opcional a través de parámetros de consulta.
Query Params
Los parámetros de ruta, por ejemplo /catalogo/:categoryId, son obligatorios. Sin el ID la ruta no funcionaría. Por otro lado, existen los parámetros de consulta que los reconocerás seguidos de un ? y separados por un &, por ejemplo /catalogo?limit=10&offset=0.
1. Creando rutas con parámetros
Para crear rutas con este tipo de parámetros, utiliza la directiva queryParams propia de Angular de la siguiente manera.
En resumen,
En Angular los queryParams son parámetros opciones que pueden viajar en la ruta de la app, y me permiten volver sharedable (compartible) una pagina dándole funcionalidad extra en dependencia de ellos.
A diferencia de los params típicos que también son sharedables pero obligatorios y generalmente me redirigen a otra pagina.
Concuerdo Joel y además estos query params son una propiedad nativa del standard de URL por lo que son una parte fundamental en el desarrollo web:
MDN web docs
Para el reto, repetí la referencia del "productId" pero en category
Está buenísimo, este clase me ayudó mucho a resolver un problema del trabajo
Esta es mi solución, porfa si alguien tiene alguna recomendación o corrección es bienvenida
import{Component,OnInit}from'@angular/core';import{ActivatedRoute}from'@angular/router';import{switchMap}from'rxjs/operators'import{ProductsService}from'../../services/products.service';import{Product}from'../../models/product.model';@Component({selector:'app-category',template:`<app-products
[productId]="productId"
[products]="products"
(loadMore)="loadMore()"></app-products>`,styleUrls:['./category.component.scss']})exportclassCategoryComponentimplementsOnInit{categoryId: string |null=null;products:Product[]=[]; limit =10; offset =0;productId: string |null=null;constructor(privateroute:ActivatedRoute,//leer parametros desde el routingprivateproductsService:ProductsService){}ngOnInit():void{this.route.paramMap.pipe(switchMap((params)=>{this.categoryId= params.get('id');if(this.categoryId){returnthis.productsService.getByCategory(this.categoryId,this.limit,this.offset)}return[];})).subscribe((data)=>{this.products= data;this.route.queryParamMap.subscribe((params)=>{this.productId= params.get('product');});});}loadMore():void{if(this.categoryId){this.productsService.getByCategory(this.categoryId,this.limit,this.offset).subscribe(data=>{this.products=this.products.concat(data.filter(product=> product.images.length>0));this.offset+=this.limit;});}}}
Recuerden darle unsubscribe a la subscripción de queryParamMap ya que si cambian de página, éste seguira esperando querys cuando no estamos en la página.
Hasta ahora muy claro el tema de las rutas en Angular.
El resumen de la clase: sharedable page.
Solo hay un problema en todo esto, no sé si se arregla más adelante.
Cuando accedes a ver el detalle de un producto y cierras la ventanita lateral que muestra ese detalle, no puedes volver a clickar en el mismo producto, porque claro el @input set, está esperando cambios, y no hay ningún cambio, ¿no se debería, poner el valor a null, el productId, cuando cerremos la ventanita?
Qué plugin usas para formatear el código? @NicolasMolina
Usa Prettier, para formatear nomás tienes que hacer un comando y listo
alt + shift + f
Al agregar la lectura de query params desde categorías, el botón de ver detalle en el componente product, redirecciona a home y agrega los query params, ¿hay manera de actualizar query params sin cambiar la ruta?
Hola, si realmente ese debería ser el comportamiento que se debe lograr que al hacer clic al detalle muestre el panel a la derecha y no vaya al home, tal vez hay algún problema en el path de tus rutas.
Si quieres nos puedes compartir tu proyecto en GitHub y los vemos.