We use cookies to enhance your experience on the site
CodeWorlds

Nested Routes and Resolve

Child Routes - Nested Paths

1export const routes: Routes = [
2  {
3    path: 'dojo',
4    component: DojoLayoutComponent,
5    children: [
6      { path: '', component: DojoHomeComponent },
7      { path: 'training', component: TrainingComponent },
8      { path: 'weapons', component: WeaponsComponent },
9      {
10        path: 'samurai/:id',
11        component: SamuraiProfileComponent,
12        children: [
13          { path: '', redirectTo: 'info', pathMatch: 'full' },
14          { path: 'info', component: SamuraiInfoComponent },
15          { path: 'skills', component: SamuraiSkillsComponent },
16          { path: 'history', component: SamuraiHistoryComponent }
17        ]
18      }
19    ]
20  }
21];
1// dojo-layout.component.ts
2@Component({
3  template: \`
4    <header>
5      <h1>Dojo</h1>
6      <nav>
7        <a routerLink="training">Training</a>
8        <a routerLink="weapons">Weapons</a>
9      </nav>
10    </header>
11
12    <!-- Children render here -->
13    <router-outlet></router-outlet>
14  \`
15})
16export class DojoLayoutComponent { }

Resolve - Data Fetching

1// resolvers/samurai.resolver.ts
2import { ResolveFn } from '@angular/router';
3import { inject } from '@angular/core';
4import { SamuraiService } from '../services/samurai.service';
5
6export const samuraiResolver: ResolveFn<Samurai> = (route) => {
7  const service = inject(SamuraiService);
8  const id = route.paramMap.get('id')!;
9  return service.getById(+id);
10};
11
12// Usage
13{
14  path: 'samurai/:id',
15  component: SamuraiDetailComponent,
16  resolve: { samurai: samuraiResolver }
17}
18
19// In the component
20export class SamuraiDetailComponent {
21  private route = inject(ActivatedRoute);
22  samurai = this.route.snapshot.data['samurai'] as Samurai;
23}
Go to CodeWorlds