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

В Angular есть мощный и универсальный Маршрутизатор. Недавно мне потребовалось обеспечить, чтобы мои компоненты могли получить доступ к информации о предыдущем маршруте, который пользователь посетил внутри моего приложения. К моему удивлению, на сегодняшний день Router не поддерживает такую ​​функциональность из коробки. Но он по-прежнему предоставляет необходимые средства для быстрого создания этой функциональности.

Сфера

В моем случае использования предполагалось, что мне нужно было получить доступ только к предыдущему маршруту внутри моего ngOnInit() жизненного цикла различных компонентов и что мне не требовалось сохранять информацию постоянным при перезагрузке страницы. Поэтому я решил:

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

Услуга

Во-первых, я создал простую службу Angular с областью действия на корневом уровне моего приложения. Затем я импортировал маршрутизатор и добавил свойства и метод getter для previousUrl. Затем я подписался на все события Router, чтобы увидеть, что происходит во время изменения маршрута:

Маршрутизатор запускает события нескольких типов во время изменения маршрута, и вы можете выбрать событие, которое соответствует вашим требованиям. В моем случае я решил использовать NavigationEnd, поскольку мое приложение использует _6 _ / _ 7_ охранников, и я хотел подсчитывать только успешные изменения маршрута, которые привели к тому, что пользователь фактически перешел на такую ​​страницу:

Дальнейшее его улучшение

Вышеупомянутое обычно работает, но проблема в том, что при использовании NavigationEnd мы сталкиваемся с состоянием гонки: пользователь страницы перенаправляется на вызовы нашей службы внутри функции конструктора или ловушки ngOnInit во время цикла навигации все еще продолжается, и событие NavigationEnd еще не запущено.

Таким образом, выбор здесь - либо использовать другой RouterEvent (например, ResolveEnd), который надежно завершается до вызова getPreviousUrl, либо использовать подписку (например, BehaviorSubject) вместо простого получателя:

Теперь с подпиской мы можем использовать наш сервис внутри компонентов нашего приложения таким образом, не забывая отписаться от нашей подписки с помощью ловушки уничтожения компонентов:

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

Заключение

Надеюсь, вам понравилось это короткое чтение, и желаю всем приятного кодирования.