Angular Router proporciona un conjunto completo de hooks de ciclo de vida y eventos que te permiten responder a cambios de navegación y ejecutar lógica personalizada durante el proceso de enrutamiento.
Eventos comunes del router
Angular Router emite eventos de navegación a los que puedes suscribirte para rastrear el ciclo de vida de la navegación. Estos eventos están disponibles a través del observable Router.events. Esta sección cubre eventos comunes del ciclo de vida de enrutamiento para navegación y seguimiento de errores (en orden cronológico).
| Eventos | Descripción |
|---|---|
NavigationStart |
Ocurre cuando comienza la navegación y contiene la URL solicitada. |
RoutesRecognized |
Ocurre después de que el router determina qué ruta coincide con la URL y contiene la información del estado de la ruta. |
GuardsCheckStart |
Comienza la fase de guards de ruta. El router evalúa guards de ruta como canActivate y canDeactivate. |
GuardsCheckEnd |
Señala la finalización de la evaluación de guards. Contiene el resultado (permitido/denegado). |
ResolveStart |
Comienza la fase de resolución de datos. Los resolvers de ruta comienzan a obtener datos. |
ResolveEnd |
La resolución de datos se completa. Todos los datos requeridos están disponibles. |
NavigationEnd |
Evento final cuando la navegación se completa exitosamente. El router actualiza la URL. |
NavigationSkipped |
Ocurre cuando el router omite la navegación (por ejemplo, navegación a la misma URL). |
Los siguientes son eventos de error comunes:
| Evento | Descripción |
|---|---|
NavigationCancel |
Ocurre cuando el router cancela la navegación. A menudo debido a que un guard retorna false. |
NavigationError |
Ocurre cuando la navegación falla. Podría ser debido a rutas inválidas o errores de resolver. |
Para una lista de todos los eventos de ciclo de vida, consulta la tabla completa de esta guía.
Cómo suscribirse a eventos del router
Cuando quieres ejecutar código durante eventos específicos del ciclo de vida de navegación, puedes hacerlo suscribiéndote a router.events y verificando la instancia del evento:
// Ejemplo de suscripción a eventos del routerimport { Component, inject, signal, effect } from '@angular/core';import { Event, Router, NavigationStart, NavigationEnd } from '@angular/router';@Component({ ... })export class RouterEventsComponent { private readonly router = inject(Router); constructor() { // Suscribirse a eventos del router y reaccionar a eventos this.router.events.pipe(takeUntilDestroyed()).subscribe((event: Event) => { if (event instanceof NavigationStart) { // Navegación iniciando console.log('Navigation starting:', event.url); } if (event instanceof NavigationEnd) { // Navegación completada console.log('Navigation completed:', event.url); } }); }}
Nota: El tipo Event de @angular/router tiene el mismo nombre que el tipo global regular Event, pero es diferente del tipo RouterEvent.
Cómo depurar eventos de enrutamiento
Depurar problemas de navegación del router puede ser desafiante sin visibilidad en la secuencia de eventos. Angular proporciona una característica de depuración integrada que registra todos los eventos del router en la consola, ayudándote a entender el flujo de navegación e identificar dónde ocurren los problemas.
Cuando necesitas inspeccionar una secuencia de eventos del Router, puedes habilitar el registro para eventos de navegación internos para depuración. Puedes configurar esto pasando una opción de configuración (withDebugTracing()) que habilita el registro detallado en consola de todos los eventos de enrutamiento.
import { provideRouter, withDebugTracing } from '@angular/router';const appRoutes: Routes = [];bootstrapApplication(AppComponent, { providers: [ provideRouter(appRoutes, withDebugTracing()) ] });
Para más información, consulta la documentación oficial sobre withDebugTracing.
Casos de uso comunes
Los eventos del router habilitan muchas características prácticas en aplicaciones del mundo real. Aquí hay algunos patrones comunes que se usan con eventos del router.
Indicadores de carga
Mostrar indicadores de carga durante la navegación:
import { Component, inject } from '@angular/core';import { Router } from '@angular/router';import { toSignal } from '@angular/core/rxjs-interop';import { map } from 'rxjs/operators';@Component({ selector: 'app-loading', template: ` @if (loading()) { <div class="loading-spinner">Loading...</div> } `})export class AppComponent { private router = inject(Router); readonly loading = toSignal( this.router.events.pipe( map(() => !!this.router.getCurrentNavigation()) ), { initialValue: false } );}
Seguimiento de analíticas
Rastrear vistas de página para analíticas:
import { Component, inject, signal, effect } from '@angular/core';import { Router, NavigationEnd } from '@angular/router';@Injectable({ providedIn: 'root' })export class AnalyticsService { private router = inject(Router); private destroyRef = inject(DestroyRef); startTracking() { this.router.events.pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(event => { // Rastrear vistas de página cuando cambia la URL if (event instanceof NavigationEnd) { // Enviar vista de página a analíticas this.analytics.trackPageView(url); } }); } private analytics = { trackPageView: (url: string) => { console.log('Page view tracked:', url); } };}
Manejo de errores
Manejar errores de navegación con gracia y proporcionar retroalimentación al usuario:
import { Component, inject, signal } from '@angular/core';import { Router, NavigationStart, NavigationError, NavigationCancel, NavigationCancellationCode } from '@angular/router';@Component({ selector: 'app-error-handler', template: ` @if (errorMessage()) { <div class="error-banner"> {{ errorMessage() }} <button (click)="dismissError()">Dismiss</button> </div> } `})export class ErrorHandlerComponent { 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.reason === NavigationCancellationCode.GuardRejected) { this.errorMessage.set('Access denied. Please check your permissions.'); } } }); } dismissError() { this.errorMessage.set(''); }}
Todos los eventos del router
Para referencia, aquí está la lista completa de todos los eventos del router disponibles en Angular. Estos eventos están organizados por categoría y listados en el orden en que típicamente ocurren durante la navegación.
Eventos de navegación
Estos eventos rastrean el proceso central de navegación desde el inicio a través del reconocimiento de rutas, verificación de guards y resolución de datos. Proporcionan visibilidad en cada fase del ciclo de vida de navegación.
| Evento | Descripción |
|---|---|
NavigationStart |
Ocurre cuando comienza la navegación |
RouteConfigLoadStart |
Ocurre antes de cargar de forma diferida una configuración de ruta |
RouteConfigLoadEnd |
Ocurre después de que se carga una configuración de ruta con lazy loading |
RoutesRecognized |
Ocurre cuando el router parsea la URL y reconoce las rutas |
GuardsCheckStart |
Ocurre al inicio de la fase de guards |
GuardsCheckEnd |
Ocurre al final de la fase de guards |
ResolveStart |
Ocurre al inicio de la fase de resolve |
ResolveEnd |
Ocurre al final de la fase de resolve |
Eventos de activación
Estos eventos ocurren durante la fase de activación cuando los componentes de ruta están siendo instanciados e inicializados. Los eventos de activación se disparan para cada ruta en el árbol de rutas, incluyendo rutas padre e hijo.
| Evento | Descripción |
|---|---|
ActivationStart |
Ocurre al inicio de la activación de ruta |
ChildActivationStart |
Ocurre al inicio de la activación de ruta hijo |
ActivationEnd |
Ocurre al final de la activación de ruta |
ChildActivationEnd |
Ocurre al final de la activación de ruta hijo |
Eventos de finalización de navegación
Estos eventos representan el resultado final de un intento de navegación. Cada navegación terminará con exactamente uno de estos eventos, indicando si tuvo éxito, fue cancelada, falló o fue omitida.
| Evento | Descripción |
|---|---|
NavigationEnd |
Ocurre cuando la navegación termina exitosamente |
NavigationCancel |
Ocurre cuando el router cancela la navegación |
NavigationError |
Ocurre cuando la navegación falla debido a un error inesperado |
NavigationSkipped |
Ocurre cuando el router omite la navegación (por ejemplo, navegación a la misma URL) |
Otros eventos
Hay un evento adicional que ocurre fuera del ciclo de vida principal de navegación, pero aún es parte del sistema de eventos del router.
| Evento | Descripción |
|---|---|
Scroll |
Ocurre durante el scrolling |
Próximos pasos
Aprende más sobre guards de ruta y tareas comunes del router.