Navegação Programática - Angular
Podemos navegar entre os recursos dentro da aplicação usando links. No entanto, o Angular também oferece suporte à navegação programática. Ou seja, podemos, de forma programada, navegar para qualquer recurso a partir de qualquer lugar da aplicação. Para isso, usamos o serviço Router
@angular/router
Vamos definir um botão no componente e um método para o botão, que será responsável por redirecionar para um recurso específico:
import { Component } from "@angular/core";
import { RouterOutlet, RouterLink, Router } 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>
</nav>
<router-outlet></router-outlet>
<button (click)="goHome()">Ir para Home</button>
</div>`
})
export class AppComponent {
constructor(private router: Router) {}
goHome() {
this.router.navigate([""]); // redireciona para a raiz da aplicação
}
}
No construtor, recebemos o objeto Router
navigate()
HomeComponent
AboutComponent
this.router.navigate(["/about"]);
Parâmetros de Rotas e Query Strings
Agora, vamos modificar o AppComponent
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { RouterOutlet, RouterLink, Router } from "@angular/router";
class Item {
constructor(public id: number, public product: string, public price: number) {}
}
@Component({
selector: "my-app",
standalone: true,
imports: [RouterOutlet, RouterLink, FormsModule],
styles: `a { padding: 5px; }`,
template: `<div>
<div class="form-group">
<h3>Parâmetros do Item</h3>
<p>
<label>ID do Modelo</label><br>
<input type="number" [(ngModel)]="item.id" />
</p>
<p>
<label>Preço</label><br>
<input type="number" [(ngModel)]="item.price" />
</p>
<p>
<label>Produto</label><br>
<input [(ngModel)]="item.product" />
</p>
<button (click)="goToItem(item)">Ir</button>
</div>
<router-outlet></router-outlet>
</div>`
})
export class AppComponent {
item: Item = new Item(1, "", 0);
constructor(private router: Router) {}
goToItem(myItem: Item) {
this.router.navigate(
["/item", myItem.id],
{
queryParams: {
"product": myItem.product,
"price": myItem.price
}
}
);
}
}
Para passar os parâmetros necessários para o componente ItemComponent
navigate()
O código do componente ItemComponent
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) {
// Observa a mudança no parâmetro 'id'
route.params.subscribe(params => this.id = params["id"]);
// Observa a mudança nos parâmetros da query string
route.queryParams.subscribe(
(queryParam: Observable<Params>) => {
this.product = queryParam["product"];
this.price = queryParam["price"];
}
);
}
}
Após inserir os dados e clicar no botão, o componente ItemComponent
