Angular 2 Активированные параметры, не работающие на Сервисе или вне <роутер-выход>
У меня очень странная проблема:
index.html
<navigation-menu *ngIf="isLoggedIn"></navigation-menu>
<div class="content-wrapper" [ngClass]="{'fullContent' : !isLoggedIn}">
<section class="content">
<router-outlet></router-outlet>
</section>
</div>
Навигационное меню является компонентом навигационного меню.
В содержимом маршрутизатора-выхода есть компонент, называемый "активы".
Что я сделал в компоненте активов:
import { ActivatedRoute}from "@angular/router";
constructor(private route: ActivatedRoute){}
public ngOnInit(): void {
this.route.params.subscribe(params => {
const id = params["id"];
}
Это работает, и я получаю параметры своего маршрута (который является своего рода "актив/: id" ).
Теперь я попробовал то же самое в своем компоненте навигационного меню (который находится "снаружи" в розетке маршрутизатора) и в глобальной службе, называемой contextservice.
Тот же код, что и выше, но он даже не срабатывает при изменении маршрута. Если я попытаюсь получить текущий моментальный снимок маршрутизатора
const strId = this.route.snapshot.params["id"];
после того, как событие NavigationEnd было запущено, это тот же результат: strId - undefined, потому что params - пустой объект.
Он работает только в моем компоненте активов.
Работает ли это так, как предполагалось, или как это должно быть обработано?
Мое намерение состояло в том, чтобы инициировать событие из глобальной службы (или "глобального" компонента, такого как навигационное меню), которое прослушивает все изменения маршрута (-params).
Моим единственным решением было бы разобрать полный URL-адрес после каждого события NavigationEnd, которое, на мой взгляд, не является правильным способом... Или обрабатывать изменения параметров в каждом дочернем компоненте (в самом маршрутизаторе).
Возможно, у меня есть только основная ошибка в понимании...
Спасибо
Решение принятого ответа:
this.router.events.subscribe(val => {
if (val instanceof RoutesRecognized) {
var strId = val.state.root.firstChild.params["id"];
}});
Не забудьте импортировать RoutesRecognized из angular router!!
Ответы
Ответ 1
Компонент, добавленный маршрутизатором, получает сегмент маршрутизатора (ActivatedRoute
), но в службе нет активированного маршрута. Вы можете подписаться на router.events и пройти дерево маршрутов (router.firstChild... `), чтобы получить параметры из определенного маршрута, который вам нужен.
См. также https://github.com/angular/angular/issues/11023