Introducción
Al crear aplicaciones, puede haber escenarios en los que queramos pasar algunos argumentos o parámetros para describir el comportamiento de la ruta. En Angular, estos se llaman parámetros de consulta, y son opcionales. Los parámetros de consulta no deben confundirse con los parámetros de ruta normales que son parámetros obligatorios y están vinculados a una sola ruta.
Para aclarar la diferencia entre los parámetros de ruta y los parámetros de consulta, imagine que está creando una aplicación que almacena productos. Puede tener una ruta que abra cualquier producto específico utilizando product_id. También puede especificar un parámetro de consulta: read_only. Cuando read_only se establece en true, el usuario solo puede ver el registro, mientras que cuando read_only es false, el usuario también puede editar el registro. De esta manera, utilizando solo una ruta, se pueden manejar tanto los casos de uso de edición como de visualización. Aquí product_id es el parámetro de ruta y read_only que es opcional es el parámetro de consulta parameter.
Requisitos previos
Para comprender completamente este artículo, se requiere familiaridad con la creación de aplicaciones utilizando Angular. También será útil tener experiencia con Angular Router, RouterLink y ActivatedRoute.
Pasar parámetros de consulta con Router.navigate
Si está utilizando Router.navigate para navegar a través de las rutas, use queryParams para enviar los parámetros de consulta.
En el ejemplo anterior, si queremos que los visitantes vean la lista de productos ordenados por popularidad, utilizaremos el siguiente código:
|
1 2 3 4 5 6 |
navigateToProducts() { this.router.navigate( ['/products'], { queryParams: { order: 'popular' } } ); } |
Usando este código, la URL se convertirá en:
|
1 |
http://localhost:4200/products?order=popular |
Sin embargo, puede haber escenarios en los que necesitemos pasar múltiples parámetros al navegar. Por ejemplo, si queremos ordenar los productos por popularidad y también por precio, podemos usar el siguiente código:
|
1 2 3 4 5 6 |
navigateToProducts() { this.router.navigate( ['/products'], { queryParams: { order: 'popular', price: 'high-to-low' } } ); } |
Esta vez la URL se convertirá en la siguiente:
|
1 |
http://localhost:4200/products?order=popular&price=high-to-low |
Esto concluye cómo establecer parámetros de consulta utilizando queryParams.
Evitar la pérdida de parámetros de consulta utilizando queryParamsHandling
Al navegar entre rutas, los parámetros tienden a perderse. Supongamos que si pasamos un argumento arg0 no se pasará cuando ocurra el enrutamiento posterior. Podemos guardar los parámetros utilizando queryParamsHandling y estableciendo el valor en preserve o merge.
En el ejemplo anterior, supongamos que queremos dirigir a los visitantes a la página de marcas desde la de producto con el parámetro de ruta { order: 'popular' }, mientras mantenemos los parámetros de ruta. Para hacer esto, podemos usar queryParamsHandling y establecerlo en preserve :
|
1 2 3 4 5 6 |
navigateToBrand() { this.router.navigate( ['/brand'], { queryParamsHandling: 'preserve' } ); } |
Esto hará que la URL se vea como:
|
1 |
http://localhost:4200/users?brand=popular |
A continuación, supongamos que queremos conservar el parámetro de consulta de la ruta anterior { order: 'popular' } mientras agregamos nuevos parámetros { price: 'high-to-low' }. Podemos establecer queryParamsHandling en merge:
|
1 2 3 4 5 6 7 8 |
navigateToBrand() { this.router.navigate( ['/brand'], { queryParams: { price: 'high-to-low' }, queryParamsHandling: 'merge' } ); } |
Con el código anterior, la URL se convertirá en:
|
1 |
http://localhost:4200/brand?order=popular&price=high-to-low |
Aquí concluimos la preservación de los parámetros de consulta utilizando queryParamsHandling para preservar o fusionar.
Pasar parámetros de consulta con RouterLink
Teniendo en cuenta nuestro enlace anterior, si queremos usar la directiva RouterLink para navegar, necesitaremos pasar los parámetros de consulta usando queryParams como se muestra a continuación:
|
1 2 3 |
<a [routerLink]="['/products']" [queryParams]="{ order: 'popular' }"> Productos </a> |
Observe cómo pasamos el objeto a queryParams usando el enlace unidireccional. También podemos pasar un objeto completo como queryParams .
Además, si queremos llevar estos parámetros de consulta adelante en la navegación posterior, podemos usar la opción queryParamsHandling. Las opciones posibles de queryParamsHandling son merge y preserve:
|
1 2 |
<a [routerLink]="['/products']" [queryParams]="{ filter: 'new', order: 'popular' }" queryParamsHandling="merge">Productos</a> |
Aquí, hemos visto cómo pasar los queryParams y el manejo de los parámetros usando queryParamsHandling en RouterLink.
Leer los valores de los parámetros de consulta
Hasta ahora hemos aprendido cómo pasar los parámetros de consulta en la ruta. Estos parámetros eran opcionales y se utilizaban para comunicar cierta información a la página de destino. Enviar los parámetros es una parte, pero también es necesario leer los parámetros de la URL y utilizarlos.
En Angular, leemos los parámetros de consulta de la ruta utilizando la clase ActivatedRoute. La clase ActivatedRoute tiene una propiedad observable llamada queryParams para revelar los parámetros de la URL actual.
Supongamos que estamos tratando con la siguiente URL:
|
1 |
http://localhost:4200/products?order=popular |
Para acceder al parámetro de consulta order en el código, utilizamos el siguiente código:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import { ActivatedRoute } from '@angular/router'; import 'rxjs/add/operator/filter'; @Component({ ... }) export class SampleComponent implements OnInit { order: string; constructor(private route: ActivatedRoute) { } ngOnInit() { this.route.queryParams .filter(params => params.order) .subscribe(params => { console.log(params); // { order: "popular" } this.order = params.order; }); } } |
Aquí en la consola, veremos el valor del parámetro de consulta order que es “popular” impreso. Si tenemos múltiples parámetros de consulta, podemos usar la queryParamMap propiedad que devuelve un observable paramsMap objeto.
Si tenemos la URL con múltiples parámetros de consulta como:
|
1 |
http://localhost:4200/products?order=popular&price=high-to-low |
Podemos acceder a estos parámetros de consulta utilizando el siguiente código:
|
1 2 3 4 5 |
this.route.queryParamMap .subscribe((params) => { this.queryObj = { ...params.keys, ...params }; } ); |
Usando el operador de propagación de objetos aquí, obtenemos el siguiente resultado:
|
1 2 3 4 5 6 7 8 |
{ "0": "order", "1": "filter", "params": { "order": "popular", "price": "high-to-low" } } |
Finalmente, deberías ser capaz de entender cómo acceder a los parámetros de consulta desde las rutas resultantes.
Conclusión
En este tutorial, analizamos la diferencia entre los parámetros de consulta y los parámetros de ruta. También vimos cómo pasar los argumentos a través de las rutas como parámetros de consulta y también recuperarlos en la página usando queryParams y queryParamsHandling con Router.navigate y RouterLink. También aprendimos cómo manejar queryParams y queryParamMap con ActivatedRoute.
Angular requiere JavaScript en su base. Si deseas profundizar tus conocimientos sobre JavaScript, puedes consultar los siguientes blogs:
- Trabajar con JavaScript: Cómo funcionan las clases
- Trabajar con JavaScript: Cómo funcionan los prototipos y las herencias
- JavaScript: Un tutorial sobre cómo indexar, dividir y manipular cadenas
¡Feliz programación!
Comentarios
Aún no hay comentarios. Sea el primero.