O Router Angular fornece um conjunto abrangente de hooks de ciclo de vida e eventos que permitem que você responda a mudanças de navegação e execute lógica customizada durante o processo de roteamento.
Eventos comuns do router
O Router Angular emite eventos de navegação que você pode fazer subscription para rastrear o ciclo de vida da navegação. Estes eventos estão disponíveis através do observable Router.events. Esta seção cobre eventos comuns de ciclo de vida de roteamento para navegação e rastreamento de erros (em ordem cronológica).
| Eventos | Descrição |
|---|---|
NavigationStart |
Ocorre quando a navegação começa e contém a URL requisitada. |
RoutesRecognized |
Ocorre depois que o router determina qual route corresponde à URL e contém as informações de estado da route. |
GuardsCheckStart |
Inicia a fase de guard de route. O router avalia guards de route como canActivate e canDeactivate. |
GuardsCheckEnd |
Sinaliza a conclusão da avaliação de guards. Contém o resultado (permitido/negado). |
ResolveStart |
Inicia a fase de resolução de dados. Resolvers de route começam a buscar dados. |
ResolveEnd |
A resolução de dados é concluída. Todos os dados necessários ficam disponíveis. |
NavigationEnd |
Evento final quando a navegação é concluída com sucesso. O router atualiza a URL. |
NavigationSkipped |
Ocorre quando o router pula a navegação (ex: navegação para a mesma URL). |
Os seguintes são eventos de erro comuns:
| Evento | Descrição |
|---|---|
NavigationCancel |
Ocorre quando o router cancela a navegação. Frequentemente devido a um guard retornar false. |
NavigationError |
Ocorre quando a navegação falha. Pode ser devido a routes inválidas ou erros de resolver. |
Para uma lista de todos os eventos de ciclo de vida, confira a tabela completa deste guia.
Como fazer subscription em eventos do router
Quando você deseja executar código durante eventos específicos do ciclo de vida de navegação, você pode fazer isso fazendo subscription em router.events e verificando a instância do evento:
// Exemplo de fazer subscription em eventos do 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() { // Fazer subscription em eventos do router e reagir a eventos this.router.events.pipe(takeUntilDestroyed()).subscribe((event: Event) => { if (event instanceof NavigationStart) { // Navegação iniciando console.log('Navigation starting:', event.url); } if (event instanceof NavigationEnd) { // Navegação concluída console.log('Navigation completed:', event.url); } }); }}
Nota: O tipo Event de @angular/router tem o mesmo nome que o tipo global regular Event, mas é diferente do tipo RouterEvent.
Como debugar eventos de roteamento
Debugar problemas de navegação do router pode ser desafiador sem visibilidade na sequência de eventos. O Angular fornece um recurso de debugging integrado que registra todos os eventos do router no console, ajudando você a entender o fluxo de navegação e identificar onde os problemas ocorrem.
Quando você precisa inspecionar uma sequência de eventos do Router, você pode habilitar logging para eventos internos de navegação para debugging. Você pode configurar isso passando uma opção de configuração (withDebugTracing()) que habilita logging detalhado no console de todos os eventos de roteamento.
import { provideRouter, withDebugTracing } from '@angular/router';const appRoutes: Routes = [];bootstrapApplication(AppComponent, { providers: [ provideRouter(appRoutes, withDebugTracing()) ] });
Para mais informações, confira a documentação oficial sobre withDebugTracing.
Casos de uso comuns
Eventos do router habilitam muitos recursos práticos em aplicações do mundo real. Aqui estão alguns padrões comuns que são usados com eventos do router.
Indicadores de carregamento
Mostrar indicadores de carregamento durante a navegação:
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 } );}
Rastreamento de analytics
Rastrear visualizações de página para analytics:
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 visualizações de página quando a URL muda if (event instanceof NavigationEnd) { // Enviar visualização de página para analytics this.analytics.trackPageView(url); } }); } private analytics = { trackPageView: (url: string) => { console.log('Page view tracked:', url); } };}
Tratamento de erros
Lidar com erros de navegação graciosamente e fornecer feedback ao usuário:
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 os eventos do router
Para referência, aqui está a lista completa de todos os eventos do router disponíveis no Angular. Estes eventos são organizados por categoria e listados na ordem em que tipicamente ocorrem durante a navegação.
Eventos de navegação
Estes eventos rastreiam o processo de navegação principal desde o início através do reconhecimento de route, verificações de guard e resolução de dados. Eles fornecem visibilidade em cada fase do ciclo de vida de navegação.
| Evento | Descrição |
|---|---|
NavigationStart |
Ocorre quando a navegação inicia |
RouteConfigLoadStart |
Ocorre antes de fazer lazy loading de uma configuração de route |
RouteConfigLoadEnd |
Ocorre depois que uma configuração de route com lazy loading carrega |
RoutesRecognized |
Ocorre quando o router analisa a URL e reconhece as routes |
GuardsCheckStart |
Ocorre no início da fase de guard |
GuardsCheckEnd |
Ocorre no final da fase de guard |
ResolveStart |
Ocorre no início da fase de resolve |
ResolveEnd |
Ocorre no final da fase de resolve |
Eventos de ativação
Estes eventos ocorrem durante a fase de ativação quando components de route estão sendo instanciados e inicializados. Eventos de ativação disparam para cada route na árvore de routes, incluindo routes pai e filha.
| Evento | Descrição |
|---|---|
ActivationStart |
Ocorre no início da ativação de route |
ChildActivationStart |
Ocorre no início da ativação de route filha |
ActivationEnd |
Ocorre no final da ativação de route |
ChildActivationEnd |
Ocorre no final da ativação de route filha |
Eventos de conclusão de navegação
Estes eventos representam o resultado final de uma tentativa de navegação. Toda navegação terminará com exatamente um destes eventos, indicando se teve sucesso, foi cancelada, falhou ou foi pulada.
| Evento | Descrição |
|---|---|
NavigationEnd |
Ocorre quando a navegação termina com sucesso |
NavigationCancel |
Ocorre quando o router cancela a navegação |
NavigationError |
Ocorre quando a navegação falha devido a um erro inesperado |
NavigationSkipped |
Ocorre quando o router pula a navegação (ex: navegação para a mesma URL) |
Outros eventos
Há um evento adicional que ocorre fora do ciclo de vida principal de navegação, mas ainda é parte do sistema de eventos do router.
| Evento | Descrição |
|---|---|
Scroll |
Ocorre durante a rolagem |
Próximos passos
Saiba mais sobre guards de route e tarefas comuns do router.