Spec-Zone.ru › Angular

Жизненный цикл и события маршрутизатора

Маршрутизатор Angular предоставляет широкий набор хуков жизненного цикла и событий, позволяющих реагировать на изменения навигации и выполнять пользовательскую логику в процессе маршрутизации.

Распространённые события маршрутизатора

Маршрутизатор Angular генерирует события навигации, на которые можно подписаться, чтобы отслеживать жизненный цикл навигации. Эти события доступны через observable Router.events. В этом разделе описаны распространённые события жизненного цикла маршрутизации, связанные с навигацией и отслеживанием ошибок (в хронологическом порядке).

События Описание
NavigationStart Возникает при начале навигации и содержит запрошенный URL.
RoutesRecognized Возникает после того, как маршрутизатор определяет, какой маршрут соответствует URL, и содержит сведения о состоянии маршрута.
GuardsCheckStart Начинается этап проверки защит маршрутов. Маршрутизатор проверяет защиты маршрутов, например canActivate и canDeactivate.
GuardsCheckEnd Означает завершение проверки защит. Содержит результат (разрешено/запрещено).
ResolveStart Начинается этап разрешения данных. Резолверы маршрутов начинают загружать данные.
ResolveEnd Разрешение данных завершено. Все необходимые данные доступны.
NavigationEnd Финальное событие, возникающее при успешном завершении навигации. Маршрутизатор обновляет URL.
NavigationSkipped Возникает, когда маршрутизатор пропускает навигацию (например, при навигации по тому же URL).

Ниже перечислены распространённые события ошибок:

Событие Описание
NavigationCancel Возникает, когда маршрутизатор отменяет навигацию. Часто это происходит из-за того, что защита возвращает false.
NavigationError Возникает, когда навигация завершается с ошибкой. Причиной могут быть недопустимые маршруты или ошибки резолвера.

Полный список всех событий жизненного цикла см. в полной таблице этого руководства.

Как подписаться на события маршрутизатора

Чтобы выполнять код при определённых событиях жизненного цикла навигации, подпишитесь на router.events и проверьте экземпляр события:

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

@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);
      }
    });
  }
}

ПРИМЕЧАНИЕ: Тип Event из @angular/router называется так же, как стандартный глобальный тип Event, но отличается от типа RouterEvent.

Как отлаживать события маршрутизации

Отладка проблем с навигацией маршрутизатора может быть сложной без возможности видеть последовательность событий. В Angular есть встроенная функция отладки, которая записывает все события маршрутизатора в консоль. Это помогает понять ход навигации и определить, где возникают проблемы.

Чтобы изучить последовательность событий Router, можно включить ведение журнала внутренних событий навигации для отладки. Для этого передайте параметр конфигурации (withDebugTracing()), который включает подробное ведение журнала всех событий маршрутизации в консоли.

import {provideRouter, withDebugTracing} from '@angular/router';

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

Дополнительные сведения см. в официальной документации о withDebugTracing.

Распространённые сценарии использования

События маршрутизатора позволяют реализовать множество полезных функций в реальных приложениях. Ниже приведены распространённые шаблоны использования событий маршрутизатора.

Индикаторы загрузки

Показывайте индикаторы загрузки во время навигации:

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

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

Отслеживание аналитики

Отслеживайте просмотры страниц для аналитики:

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);
    },
  };
}

Обработка ошибок

Корректно обрабатывайте ошибки навигации и сообщайте о них пользователям:

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('');
  }
}

Все события маршрутизатора

Для справки ниже приведён полный список всех событий маршрутизатора, доступных в Angular. События сгруппированы по категориям и перечислены в порядке, в котором они обычно возникают во время навигации.

События навигации

Эти события отслеживают основные этапы навигации: от её начала до распознавания маршрута, проверки защит и разрешения данных. Они позволяют видеть каждый этап жизненного цикла навигации.

Событие Описание
NavigationStart Возникает при начале навигации
RouteConfigLoadStart Возникает перед ленивой загрузкой конфигурации маршрута
RouteConfigLoadEnd Возникает после загрузки конфигурации маршрута с помощью ленивой загрузки
RoutesRecognized Возникает, когда маршрутизатор анализирует URL и распознаёт маршруты
GuardsCheckStart Возникает в начале этапа проверки защит
GuardsCheckEnd Возникает в конце этапа проверки защит
ResolveStart Возникает в начале этапа разрешения данных
ResolveEnd Возникает в конце этапа разрешения данных

События активации

Эти события возникают на этапе активации, когда создаются и инициализируются компоненты маршрутов. События активации возникают для каждого маршрута в дереве маршрутов, включая родительские и дочерние маршруты.

Событие Описание
ActivationStart Возникает в начале активации маршрута
ChildActivationStart Возникает в начале активации дочернего маршрута
ActivationEnd Возникает в конце активации маршрута
ChildActivationEnd Возникает в конце активации дочернего маршрута

События завершения навигации

Эти события отражают итог попытки навигации. Каждая навигация завершается ровно одним из этих событий, указывающим, была ли она успешной, отменённой, завершилась с ошибкой или была пропущена.

Событие Описание
NavigationEnd Возникает при успешном завершении навигации
NavigationCancel Возникает, когда маршрутизатор отменяет навигацию
NavigationError Возникает, когда навигация завершается с ошибкой из-за непредвиденной ошибки
NavigationSkipped Возникает, когда маршрутизатор пропускает навигацию (например, при навигации по тому же URL)

Другие события

Есть ещё одно событие, которое возникает вне основного жизненного цикла навигации, но всё же является частью системы событий маршрутизатора.

Событие Описание
Scroll Возникает во время прокрутки

Дальнейшие шаги

Узнайте больше о защитах маршрутов и распространённых задачах маршрутизатора.

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/routing/lifecycle-and-events

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API