Angular est-il vraiment plus compliqué que React ?

Quand on débute avec Angular, il est facile de se sentir découragé face à la multitude de concepts à assimiler. Cette complexité peut inciter à se tourner vers des frameworks comme React, qui semblent plus simples à première vue. Mais est-ce vraiment le cas ?

Abonnez-vous à notre chaîne

Pour profiter des prochaines vidéos sur Angular, abonnez-vous à la nouvelle chaîne YouTube !

Skip to content

Vous souhaitez recevoir de l'aide sur ce sujet ? rejoignez la communauté Angular.fr sur Discord.

Les Router Events dans Angular

Les Router Events sont des événements émis par le Router d'Angular qui nous permettent de suivre et réagir aux différentes étapes de la navigation dans notre application. C'est un peu comme avoir un GPS qui nous informe en temps réel de chaque étape de notre trajet !

Voici comment implémenter un suivi des événements de navigation :

ts
import { Injectable, signal } from '@angular/core';
import { Router, Event, NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
import { inject } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class NavigationService {
  private router = inject(Router);
  loading = signal(false);

  constructor() {
    this.router.events.subscribe((event: Event) => {
      switch (true) {
        case event instanceof NavigationStart: {
          this.loading.set(true);
          break;
        }
        case event instanceof NavigationEnd: {
          this.loading.set(false);
          break;
        }
        case event instanceof NavigationError: {
          this.loading.set(false);
          console.error('Erreur de navigation:', event);
          break;
        }
      }
    });
  }
}
ts
import { Component, inject } from '@angular/core';
import { NavigationService } from './navigation.service';
import { RouterOutlet } from '@angular/router';

@Component({
  selector: 'app-root',
  template: `
    @if (navigationService.loading()) {
      <div class="loading">Chargement en cours...</div>
    }
    <router-outlet />
  `,
  standalone: true,
  imports: [RouterOutlet]
})
export class AppComponent {
  navigationService = inject(NavigationService);
}

Attention à la performance

Ne vous abonnez aux Router Events que si c'est nécessaire. Trop d'observateurs peuvent impacter les performances de votre application.

Utilisation avec provideAppInitializer

Vous pouvez également utiliser les Router Events dès l'initialisation de votre application en utilisant provideAppInitializer. C'est particulièrement utile si vous devez mettre en place une surveillance des routes dès le démarrage de l'application.

ts
import { ApplicationConfig, inject, provideAppInitializer } from '@angular/core';
import { provideRouter } from '@angular/router';
import { NavigationService } from './navigation.service';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes),
    provideAppInitializer(() => {
      const navigationService = inject(NavigationService);
      // Initialiser le service de navigation dès le démarrage
      navigationService.initialize();
    })
  ]
};
ts
@Injectable({
  providedIn: 'root'
})
export class NavigationService {
  private router = inject(Router);

  initialize() {
    this.router.events.subscribe((event: Event) => {
      if (event instanceof NavigationEnd) {
        // Logique d'initialisation personnalisée
        // Par exemple, sauvegarder l'historique de navigation
        this.saveNavigationHistory(event.urlAfterRedirects);
      }
    });
  }
}

Avantage

L'utilisation de provideAppInitializer garantit que votre logique de surveillance des routes est mise en place avant même que l'application ne commence à gérer les navigations utilisateur.

Cas d'utilisation courants

  1. Afficher un loader global
ts
this.router.events.subscribe((event: Event) => {
  if (event instanceof NavigationStart) {
    // Afficher le loader
    this.showLoader();
  }
});
  1. Tracer les navigations
ts
this.router.events.subscribe((event: Event) => {
  if (event instanceof NavigationEnd) {
    // Envoyer les données de navigation à un service d'analytics
    this.analyticsService.trackPageView({
      url: event.urlAfterRedirects
    });
  }
});
  1. Gérer les erreurs de navigation
ts
this.router.events.subscribe((event: Event) => {
  if (event instanceof NavigationError) {
    // Rediriger vers une page d'erreur
    this.router.navigate(['/error'], {
      queryParams: { message: event.error.message }
    });
  }
});

Les Router Events sont particulièrement utiles pour :

  • Implémenter des indicateurs de chargement globaux
  • Tracer la navigation des utilisateurs
  • Gérer les erreurs de navigation de manière centralisée
  • Exécuter des actions avant ou après la navigationd

Liste des événements de navigation

Voici tous les événements émis par le Router pendant une navigation :

ÉvénementDescription
NavigationStartÉmis lorsque la navigation commence
RouteConfigLoadStartÉmis juste avant que le Router charge une configuration de route de manière lazy
RouteConfigLoadEndÉmis après qu'une route a été chargée en lazy loading
RoutesRecognizedÉmis quand le Router analyse l'URL et reconnaît les routes
GuardsCheckStartÉmis quand le Router commence la phase de vérification des Guards
ChildActivationStartÉmis quand le Router commence l'activation des routes enfants
ActivationStartÉmis quand le Router commence l'activation d'une route
GuardsCheckEndÉmis quand le Router termine avec succès la phase de vérification des Guards
ResolveStartÉmis quand le Router commence la phase de résolution des données
ResolveEndÉmis quand le Router termine avec succès la phase de résolution
ChildActivationEndÉmis quand le Router termine l'activation des routes enfants
ActivationEndÉmis quand le Router termine l'activation d'une route
NavigationEndÉmis quand la navigation se termine avec succès
NavigationCancelÉmis quand la navigation est annulée (par exemple par un Guard retournant false)
NavigationErrorÉmis quand la navigation échoue à cause d'une erreur inattendue
ScrollÉmis lors d'un événement de défilement

Conseil d'utilisation

Pour déboguer la navigation, vous pouvez utiliser l'option withDebugTracing() dans la configuration du Router dans le fichier app.config.ts. Cela affichera tous ces événements dans la console du navigateur.

ts
import { ApplicationConfig, provideRouter, withDebugTracing } from '@angular/core';
import { routes } from './app/app.routes';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes, withDebugTracing())
  ]
};

Chaque mois, recevez en avant-première notre newsletter avec les dernières actualités, tutoriels, astuces et ressources Angular directement par email !