Guides approfondis
Routing

Cycle de vie et événements du router

Le router d'Angular fournit un ensemble complet de lifecycle hooks et d'événements qui vous permettent de réagir aux changements de navigation et d'exécuter une logique personnalisée pendant le processus de routing.

Événements courants du router

Le router d'Angular émet des événements de navigation auxquels vous pouvez vous abonner pour suivre le cycle de vie de la navigation. Ces événements sont disponibles via l'observable Router.events. Cette section présente les événements courants du cycle de vie du routing pour le suivi de la navigation et des erreurs (dans l'ordre chronologique).

Événements Description
NavigationStart Se produit au début de la navigation et contient l'URL demandée.
RoutesRecognized Se produit une fois que le router a déterminé quelle route correspond à l'URL et contient les informations d'état de la route.
GuardsCheckStart Démarre la phase des guards de route. Le router évalue les guards de route comme canActivate et canDeactivate.
GuardsCheckEnd Signale la fin de l'évaluation des guards. Contient le résultat (autorisé/refusé).
ResolveStart Démarre la phase de résolution des données. Les resolvers et les resources de route commencent à récupérer les données.
ResolveEnd La résolution des données est terminée. Toutes les données requises et les resources bloquantes deviennent disponibles.
NavigationEnd Événement final lorsque la navigation se termine avec succès. Le router met à jour l'URL.
NavigationSkipped Se produit lorsque le router ignore la navigation (par exemple, navigation vers la même URL).

Voici les événements d'erreur courants :

Événement Description
NavigationCancel Se produit lorsque le router annule la navigation, souvent parce qu'une guard a renvoyé false.
NavigationError Se produit lorsque la navigation échoue, par exemple à cause de routes invalides, d'erreurs de resolver ou de resources bloquantes rejetées.

Pour la liste de tous les événements du cycle de vie, consultez le tableau complet de ce guide.

Comment s'abonner aux événements du router

Pour exécuter du code lors d'événements précis du cycle de vie de la navigation, abonnez-vous à router.events et vérifiez l'instance de l'événement :

// Example of subscribing to router events
import {Component, inject, signal, effect} from '@angular/core';
import {Event, Router, NavigationStart, NavigationEnd} from '@angular/router';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';

@Component(/* ... */)
export class RouterEvents {
  private readonly router = inject(Router);

  constructor() {
    // Subscribe to router events and react to events
    this.router.events.pipe(takeUntilDestroyed()).subscribe((event: Event) => {
      if (event instanceof NavigationStart) {
        // Navigation starting
        console.log('Navigation starting:', event.url);
      }
      if (event instanceof NavigationEnd) {
        // Navigation completed
        console.log('Navigation completed:', event.url);
      }
    });
  }
}

Note : Le type Event de @angular/router porte le même nom que le type global Event habituel, mais il est différent du type RouterEvent.

Comment déboguer les événements de routing

Déboguer des problèmes de navigation du router peut s'avérer difficile sans visibilité sur la séquence des événements. Angular fournit une fonctionnalité de débogage intégrée qui journalise tous les événements du router dans la console, ce qui vous aide à comprendre le déroulement de la navigation et à identifier où se produisent les problèmes.

Lorsque vous devez inspecter une séquence d'événements du router, vous pouvez activer la journalisation des événements de navigation internes à des fins de débogage. Pour cela, passez une option de configuration (withDebugTracing()) qui active une journalisation détaillée de tous les événements de routing dans la console.

import {provideRouter, Routes, withDebugTracing} from '@angular/router';
import {bootstrapApplication} from '@angular/platform-browser';

const appRoutes: Routes = [];
bootstrapApplication(App, {
  providers: [provideRouter(appRoutes, withDebugTracing())],
});

Pour en savoir plus, consultez la documentation officielle de withDebugTracing.

Cas d'usage courants

Les événements du router permettent de nombreuses fonctionnalités pratiques dans les applications réelles. Voici quelques patterns courants utilisés avec les événements du router.

Indicateurs de chargement

Affichez des indicateurs de chargement pendant la navigation :

import {Component, computed, inject} from '@angular/core';
import {Router, RouterOutlet} from '@angular/router';

@Component({
  selector: 'app-root',
  imports: [RouterOutlet],
  template: `
    @if (isNavigating()) {
      <div class="loading-bar">Loading...</div>
    }
    <router-outlet />
  `,
})
export class App {
  private router = inject(Router);
  isNavigating = computed(() => !!this.router.currentNavigation());
}

Suivi analytique

Suivez les pages vues à des fins d'analyse :

import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {inject, DestroyRef, Service} from '@angular/core';
import {Router, NavigationEnd} from '@angular/router';

@Service()
export class AnalyticsService {
  private router = inject(Router);
  private destroyRef = inject(DestroyRef);

  startTracking() {
    this.router.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
      // Track page views when URL changes
      if (event instanceof NavigationEnd) {
        // Send page view to analytics
        this.analytics.trackPageView(event.url);
      }
    });
  }

  private analytics = {
    trackPageView: (url: string) => {
      console.log('Page view tracked:', url);
    },
  };
}

Gestion des erreurs

Gérez les erreurs de navigation proprement et informez l'utilisateur :

import {Component, inject, signal} from '@angular/core';
import {
  Router,
  NavigationStart,
  NavigationError,
  NavigationCancel,
  NavigationCancellationCode,
} from '@angular/router';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';

@Component({
  selector: 'app-error-handler',
  template: `
    @if (errorMessage()) {
      <div class="error-banner">
        {{ errorMessage() }}
        <button (click)="dismissError()">Dismiss</button>
      </div>
    }
  `,
})
export class ErrorHandler {
  private router = inject(Router);
  readonly errorMessage = signal('');

  constructor() {
    this.router.events.pipe(takeUntilDestroyed()).subscribe((event) => {
      if (event instanceof NavigationStart) {
        this.errorMessage.set('');
      } else if (event instanceof NavigationError) {
        console.error('Navigation error:', event.error);
        this.errorMessage.set('Failed to load page. Please try again.');
      } else if (event instanceof NavigationCancel) {
        console.warn('Navigation cancelled:', event.reason);
        if (event.code === NavigationCancellationCode.GuardRejected) {
          this.errorMessage.set('Access denied. Please check your permissions.');
        }
      }
    });
  }

  dismissError() {
    this.errorMessage.set('');
  }
}

Tous les événements du router

Pour référence, voici la liste complète de tous les événements du router disponibles dans Angular. Ces événements sont regroupés par catégorie et listés dans l'ordre où ils se produisent généralement pendant la navigation.

Ces événements suivent le processus de navigation principal, du démarrage jusqu'à la reconnaissance des routes, à la vérification des guards et à la résolution des données. Ils donnent de la visibilité sur chaque phase du cycle de vie de la navigation.

Événement Description
NavigationStart Se produit au démarrage de la navigation
RouteConfigLoadStart Se produit avant le chargement en lazy loading d'une configuration de route
RouteConfigLoadEnd Se produit après le chargement d'une configuration de route en lazy loading
RoutesRecognized Se produit lorsque le router analyse l'URL et reconnaît les routes
GuardsCheckStart Se produit au début de la phase des guards
GuardsCheckEnd Se produit à la fin de la phase des guards
ResolveStart Se produit au début de la phase de résolution
ResolveEnd Se produit à la fin de la phase de résolution

Événements d'activation

Ces événements se produisent pendant la phase d'activation, lorsque les composants des routes sont instanciés et initialisés. Les événements d'activation sont déclenchés pour chaque route de l'arbre de routes, y compris les routes parentes et enfants.

Événement Description
ActivationStart Se produit au début de l'activation d'une route
ChildActivationStart Se produit au début de l'activation d'une route enfant
ActivationEnd Se produit à la fin de l'activation d'une route
ChildActivationEnd Se produit à la fin de l'activation d'une route enfant

Ces événements représentent l'issue finale d'une tentative de navigation. Chaque navigation se termine par exactement un de ces événements, qui indique si elle a réussi, a été annulée, a échoué ou a été ignorée.

Événement Description
NavigationEnd Se produit lorsque la navigation se termine avec succès
NavigationCancel Se produit lorsque le router annule la navigation
NavigationError Se produit lorsque la navigation échoue à cause d'une erreur inattendue
NavigationSkipped Se produit lorsque le router ignore la navigation (par exemple, navigation vers la même URL)

Autres événements

Il existe un événement supplémentaire qui se produit en dehors du cycle de vie principal de la navigation, mais qui fait tout de même partie du système d'événements du router.

Événement Description
Scroll Se produit pendant le défilement

Prochaines étapes

Découvrez-en plus sur les guards de route, la récupération de données avec les resources et les tâches courantes du router.