Parâmetros de String de Consulta em Angular
Além dos parâmetros de rota, uma solicitação pode conter parâmetros na string de consulta. Por exemplo, na requisição http://localhost:4200/item?product=phone&price=200
, a parte product=phone&price=200
representa os parâmetros da consulta: product
e price
. Esses parâmetros são adicionados no final do endereço após o ponto de interrogação e separados por um "e" comercial: &
.
Os parâmetros da string de consulta não afetam a definição das rotas, e sua quantidade é arbitrária. Vamos usar o projeto do tema anterior como base para este exemplo:
helloapp/ ├── src/ │ ├── app/ │ │ ├── about.component.ts │ │ ├── app.component.ts │ │ ├── app.config.ts │ │ ├── item.component.ts │ │ ├── home.component.ts │ │ ├── not-found.component.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Neste projeto, o componente ItemComponent
já foi definido para receber um parâmetro de rota. Agora, vamos adicionar a capacidade de obter parâmetros da string de consulta:
import { Component } from "@angular/core";
import { ActivatedRoute, Params } from "@angular/router";
import { Observable } from "rxjs";
@Component({
selector: "item-info",
template: `<h2>Modelo {{ id }}</h2>
<div>Produto: {{ product }}</div>
<div>Preço: {{ price }}</div>`,
})
export class ItemComponent {
id: number | undefined;
product: string | undefined;
price: number | undefined;
constructor(private route: ActivatedRoute) {
// monitorando alterações no parâmetro id
route.params.subscribe((params) => (this.id = params["id"]));
// monitorando alterações nos parâmetros da string de consulta
route.queryParams.subscribe((queryParam: Observable<Params>) => {
this.product = queryParam["product"];
this.price = queryParam["price"];
});
}
}
Neste exemplo, as propriedades product
e price
são definidas para armazenar os parâmetros recebidos. A obtenção dos parâmetros da string de consulta é semelhante à obtenção dos parâmetros da rota, mas neste caso, usamos a propriedade queryParams
da classe ActivatedRoute
, que é do tipo Observable<Params>
.
Agora, podemos passar dados para o ItemComponent através da string de consulta, como no exemplo: http://localhost:4200/item/5?product=phone&price=200
.
Em seguida, vamos modificar o código do AppComponent
, definindo links com parâmetros:
import { Component } from "@angular/core";
import { RouterOutlet, RouterLink } from "@angular/router";
@Component({
selector: "my-app",
standalone: true,
imports: [RouterOutlet, RouterLink],
styles: `a { padding: 5px; }`,
template: `<div>
<nav>
<a routerLink="">Página Inicial</a>
<a routerLink="/about">Sobre</a>
<a routerLink="/item/5" [queryParams]="{ product: 'phone', price: 200 }">Item 5</a>
<a routerLink="/item/8" [queryParams]="{ product: 'tablet' }">Item 8</a>
</nav>
<router-outlet></router-outlet>
</div>`,
})
export class AppComponent {}
Para passar os parâmetros no link, usamos a diretiva queryParams
, que aceita um objeto JavaScript.