Rotas Filhas - Angular
Nos temas anteriores, trabalhamos com rotas simples, onde o sistema de roteamento seleciona um componente com base na URL e o insere no componente principal, o AppComponent
Por exemplo, vamos usar um projeto dos temas anteriores com a seguinte estrutura:
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
Agora, vamos adicionar dois componentes simples na pasta src/app
item.details.component.ts
import { Component } from "@angular/core";
@Component({
selector: "item-details",
template: `<h2>Informações sobre o produto</h2>`
})
export class ItemDetailsComponent{}
Em seguida, adicionamos o segundo arquivo item.stat.component.ts
import { Component } from "@angular/core";
@Component({
selector: "item-stat",
template: `<h2>Estatísticas do produto</h2>`
})
export class ItemStatComponent{}
Agora temos dois componentes: ItemDetailsComponent
ItemStatComponent
ItemComponent
Poderíamos definir rotas diretas para esses componentes da seguinte forma:
{ path: "item/:id/details", component: ItemDetailsComponent },
{ path: "item/:id/stat", component: ItemStatComponent },
Nesse caso, id
ItemComponent
app.config.ts
import { ApplicationConfig } from "@angular/core";
import { provideRouter, Routes } from "@angular/router";
import { HomeComponent } from "./home.component";
import { ItemComponent } from "./item.component";
import { ItemStatComponent } from "./item.stat.component";
import { ItemDetailsComponent } from "./item.details.component";
// Definindo rotas filhas
const itemRoutes: Routes = [
{ path: "details", component: ItemDetailsComponent },
{ path: "stat", component: ItemStatComponent },
];
const appRoutes: Routes = [
{ path: "item/:id", component: ItemComponent, children: itemRoutes },
{ path: "", component: HomeComponent }
];
export const appConfig: ApplicationConfig = {
providers: [provideRouter(appRoutes)]
};
Cada rota filha é mapeada para uma parte específica da URL. Para aplicar essas rotas, usamos a propriedade children na rota do componente ItemComponent:
{ path: "item/:id", component: ItemComponent, children: itemRoutes }
Agora vamos modificar o ItemComponent
import { Component } from "@angular/core";
import { ActivatedRoute, RouterOutlet } from "@angular/router";
@Component({
selector: "item-info",
standalone: true,
imports: [RouterOutlet],
template: `<h1>Produto {{id}}</h1>
<router-outlet></router-outlet>`
})
export class ItemComponent {
id: number;
constructor(private route: ActivatedRoute) {
route.params.subscribe(params => this.id = params["id"]);
}
}
Aqui, o elemento <router-outlet></router-outlet>
ItemDetailsComponent
ItemStatComponent
Também vamos alterar o componente principal, AppComponent
ItemDetailsComponent
ItemStatComponent
import { Component } from "@angular/core";
import { RouterOutlet, RouterLink } from "@angular/router";
@Component({
selector: "my-app",
standalone: true,
imports: [RouterOutlet, RouterLink],
styles: `a { padding: 3px; }`,
template: `<div>
<nav>
<a routerLink="">Início</a> |
<a routerLink="/item/5/details">Informações sobre o produto</a> |
<a routerLink="/item/5/stat">Estatísticas do produto</a>
</nav>
<router-outlet></router-outlet>
</div>`
})
export class AppComponent {}
Ao clicar nesses links, o roteamento será ativado para o componente ItemComponent
id
ItemDetailsComponent
ItemStatComponent

