Parâmetros de Rotas - Angular
As rotas podem definir parâmetros que nos permitem passar dados para um componente a partir de fontes externas. Para ilustrar, vamos utilizar o projeto do tema anterior:
helloapp/ ├── src/ │ ├── app/ │ │ ├── about.component.ts │ │ ├── app.component.ts │ │ ├── app.config.ts │ │ ├── home.component.ts │ │ ├── not-found.component.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Dentro da pasta src/app
item.component.ts
import { Component } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
@Component({
selector: "item-info",
template: `<h2>Modelo {{id}}</h2>`
})
export class ItemComponent {
id: number;
constructor(private activateRoute: ActivatedRoute) {
this.id = activateRoute.snapshot.params["id"];
}
}
Para obter os parâmetros de rota, utilizamos o serviço ActivatedRoute
A propriedade snapshot
Agora precisamos definir uma rota que utilize este componente. Vamos modificar o arquivo app.config.ts
import { ApplicationConfig } from "@angular/core";
import { provideRouter, Routes } from "@angular/router";
import { HomeComponent } from "./home.component";
import { AboutComponent } from "./about.component";
import { NotFoundComponent } from "./not-found.component";
import { ItemComponent } from "./item.component";
const appRoutes: Routes = [
{ path: "", component: HomeComponent },
{ path: "about", component: AboutComponent },
{ path: "item/:id", component: ItemComponent },
{ path: "**", component: NotFoundComponent }
];
export const appConfig: ApplicationConfig = {
providers: [provideRouter(appRoutes)]
};
Aqui, adicionamos uma nova rota:
{ path: "item/:id", component: ItemComponent }
O token :id
/item/6
id
Agora, vamos ajustar o componente principal AppComponent
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="">Home</a>
<a routerLink="/about">Sobre</a>
<a routerLink="/item/5">Item 5</a>
</nav>
<router-outlet></router-outlet>
</div>`
})
export class AppComponent {}
Ao definir um link para um componente que utiliza parâmetros de rota, todos os parâmetros necessários são inseridos diretamente na URL:
<a routerLink="/item/5">Item 5</a>
Ao iniciar a aplicação, podemos acessar o componente ItemComponent
id=5

Problemas com Múltiplos Parâmetros de Rotas
Este método funciona bem para uma única rota, mas se tivermos vários links apontando para o mesmo componente com diferentes ids, como:
<a routerLink="/item/5">Item 5</a>
<a routerLink="/item/8">Item 8</a>
Se navegarmos primeiro para o link do Item 5
id=5
id=5
Para resolver esse problema, precisamos atualizar dinamicamente o valor de id
ItemComponent
import { Component } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Subscription } from "rxjs";
@Component({
selector: "item-info",
template: `<h2>Modelo {{id}}</h2>`
})
export class ItemComponent {
id: number | undefined;
private subscription: Subscription;
constructor(private activateRoute: ActivatedRoute) {
this.subscription = activateRoute.params.subscribe(params => this.id = params["id"]);
}
}
O método subscribe()
Outra abordagem para resolver essa questão é utilizar o método ngOnInit
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { switchMap } from "rxjs/operators";
@Component({
selector: "item-info",
template: `<h2>Modelo {{id}}</h2>`
})
export class ItemComponent implements OnInit {
id: number | undefined;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.paramMap.pipe(
switchMap(params => params.getAll("id"))
).subscribe(data => this.id = +data);
}
}
Neste caso, o valor de id
ngOnInit
paramMap
Observable<ParamMap>
pipe()
switchMap()
id
Dessa forma, o componente consegue gerenciar corretamente diferentes parâmetros de rota ao longo da navegação.