Подтвердить что ты не робот

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!!

4b9b3361

Ответ 1

Компонент, добавленный маршрутизатором, получает сегмент маршрутизатора (ActivatedRoute), но в службе нет активированного маршрута. Вы можете подписаться на router.events и пройти дерево маршрутов (router.firstChild... `), чтобы получить параметры из определенного маршрута, который вам нужен.

См. также https://github.com/angular/angular/issues/11023