Routage
Configuration de Base
Section intitulée « Configuration de Base »import { Routes } from '@angular/router';
export const routes: Routes = [ { path: '', component: HomeComponent }, { path: 'about', component: AboutComponent }, { path: 'users/:id', component: UserDetailComponent }, { path: '**', component: NotFoundComponent } // Wildcard];
// main.tsimport { provideRouter } from '@angular/router';import { routes } from './app.routes';
bootstrapApplication(AppComponent, { providers: [provideRouter(routes)]});Router Outlet
Section intitulée « Router Outlet »@Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet, RouterLink], template: ` <nav> <a routerLink="/">Home</a> <a routerLink="/about">About</a> <a [routerLink]="['/users', userId]">User</a> </nav> <router-outlet></router-outlet> `})export class AppComponent {}Paramètres de Route
Section intitulée « Paramètres de Route »import { Component } from '@angular/core';import { ActivatedRoute } from '@angular/router';
@Component({ template: `<p>User ID: {{ userId }}</p>`})export class UserDetailComponent { route = inject(ActivatedRoute); userId: string | null = null;
ngOnInit() { // Snapshot (one-time) this.userId = this.route.snapshot.paramMap.get('id');
// Observable (reactive) this.route.paramMap.subscribe(params => { this.userId = params.get('id'); }); }}Paramètres de Requête
Section intitulée « Paramètres de Requête »// Navigate with query paramsrouter.navigate(['/search'], { queryParams: { q: 'angular', page: 1 } });// URL: /search?q=angular&page=1
// Read query paramsthis.route.queryParamMap.subscribe(params => { const query = params.get('q'); const page = params.get('page');});Navigation Programmatique
Section intitulée « Navigation Programmatique »import { Router } from '@angular/router';
export class AppComponent { router = inject(Router);
goToUser(id: number) { this.router.navigate(['/users', id]); }
goToSearch() { this.router.navigate(['/search'], { queryParams: { q: 'angular' }, fragment: 'section1' // URL: /search?q=angular#section1 }); }
goBack() { this.router.navigate(['..'], { relativeTo: this.route }); }}Routes Enfants
Section intitulée « Routes Enfants »export const routes: Routes = [ { path: 'products', component: ProductsComponent, children: [ { path: '', component: ProductListComponent }, { path: ':id', component: ProductDetailComponent }, { path: ':id/edit', component: ProductEditComponent } ] }];
// ProductsComponent template@Component({ template: ` <h1>Products</h1> <router-outlet></router-outlet> <!-- Child routes render here --> `})Router Link Active
Section intitulée « Router Link Active »<a routerLink="/home" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> Home</a>
<style> .active { font-weight: bold; color: blue; }</style>Route Data & Resolvers
Section intitulée « Route Data & Resolvers »// Static data{ path: 'admin', component: AdminComponent, data: { title: 'Admin Panel', role: 'admin' }}
// Read datathis.route.data.subscribe(data => { console.log(data['title']); // 'Admin Panel'});Outlets Nommés
Section intitulée « Outlets Nommés »{ path: 'dashboard', component: DashboardComponent, children: [ { path: '', component: MainContentComponent }, { path: 'sidebar', component: SidebarComponent, outlet: 'sidebar' } ]}
// Template<router-outlet></router-outlet><router-outlet name="sidebar"></router-outlet>
// Navigaterouter.navigate(['/dashboard', { outlets: { sidebar: ['sidebar'] } }]);Bonnes Pratiques
Section intitulée « Bonnes Pratiques »- Utiliser le lazy loading pour les grands modules
- Toujours gérer les 404 avec une route wildcard
- Utiliser les guards pour l’authentification/autorisation
- Préférer la navigation relative dans les routes enfants
- Utiliser les resolvers pour pré-charger les données

