Активировать пункт меню при изменении параметра url

У меня есть боковая навигация, в которой есть раскрывающийся список. В нем вы можете выбрать пользователя. В зависимости от пользователя доступны разные пункты меню (без проблем). Если вы измените пользователя с помощью раскрывающегося списка (независимо от того, в каком пункте меню вы находитесь), вы должны быть перенаправлены на страницу сведений о пользователе (также работает).

Теперь к проблеме: если я нахожусь в подробном представлении для userA (пункт меню выделен) и меняю пользователя на userB, я (правильно) останусь в подробном представлении. URL-адрес изменится правильно, и в представлении отобразятся сведения для пользователя B. НО пункт меню больше не подсвечивается. Много пробовал, но пока ничего не работает.

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

То, что у меня есть прямо сейчас (в значительной степени сокращено):

  • sidenav.component.html
    <mat-list-item>
      <div>
        <mat-label fxLayout = "row">
          <span>Selected User</span>
        </mat-label>
        <mat-select #select placeholder = "Select User" (selectionChange) = "selectionChange()">
          <mat-option *ngFor = "let u of user" [value] = "u">
            {{ u.name }}
          </mat-option>
        </mat-select>
      </div>
    </mat-list-item>

    <mat-list-item>  
      <a mat-line [routerLink] = "['/user', user.id, 'details']" [routerLinkActive] = "['active']">User</a>  
    </mat-list-item>

    // more mat-list-items in here  
  • sidenav.component.ts
    selectionChange(): void {
      this.userService.navigate();
    }  
  • user.service.ts
    navigate(): void {
      this.router.navigate(['/user/' + this.user.id + '/details']);
    }  
  • app-routing.module.ts
    const appRoutes: Routes = [
      {
        path: '',
        component: MyAppComponent,
        children: [
          {
            path: 'user',
            loadChildren: './user/user.module#UserModule',
          },
          {
            path: 'user/:userID/details',
            loadChildren: './user-details/user-details.module#UserDetailsModule',
          },
        ],
      }
    ];

Есть ли у кого-нибудь идеи, как держать пункт меню активным, если меняется только параметр в url? Я использую Angular6.

Заранее спасибо.

Обновлено: Для пояснения боковая навигация в конце выглядит так:
Раскрывающийся список пользователей (с UserA и UserB)
Подробности Проекты [Дополнительные пункты меню]

Я хочу, чтобы Details был выделен, когда я нахожусь в этом представлении

Ваш компонент, отображающий подробное представление, должен подписаться на ActivatedRoute. Вы получаете userId и устанавливаете, для какого пользователя вы фактически просматриваете детали, все, что вам нужно сделать, это установить userId в сервисе, и ваш компонент sidenav должен получить идентификатор пользователя из сервиса. angular.io/api/router/ActivatedRoute

Florian 27.11.2018 14:07

ты имеешь в виду вот так? Подробно просмотреть this.subscriptions.push(this.route.paramMap.subscribe((m) => { this.userID = m.get('userID'); }));

contini 27.11.2018 14:31

в sidenav я уже получаю пользователя из сервиса.

contini 27.11.2018 14:34

Можете ли вы показать свой код, который выделяет «пункт меню»?

Florian 27.11.2018 14:48

До сих пор использовался только [routerLinkActive] = "['active']" в теге atag в sidenav.html и стилизовал его с помощью css a.active {background-color: #FF0000}. К сожалению, класс active теряется при вызове router.navigate() по тому же URL-адресу с другим параметром userID. Похоже, я что-то не так делаю: /

contini 27.11.2018 15:07

active - это свойство css, срабатывающее при нажатии ссылки, поэтому я бы сказал, что поведение довольно нормальное. Могу подсказать: <mat-option *ngFor = "let u of user" [value] = "u" [ngStyle] = "{ 'background-color': u.id === userId ? '#FF0000' : 'none' }">

Florian 27.11.2018 15:15

создайте переменную userId в своем компоненте sidenav и назначьте идентификатор своей переменной user в своем user.service

Florian 27.11.2018 15:17

С вашим предложением ngStyle я только оформляю свой раскрывающийся список, верно? Но я хочу стилизовать выбранный пункт меню, извините, если это было неясно. У меня есть раскрывающийся список со всеми пользователями, а за пределами раскрывающегося списка у меня есть разные пункты меню, такие как Details, Projects, ... Когда я, например, страницу Projects, и я вызываю страницу Details через router.navigate(), пункт меню Detail выделяется. Если я уже использую Details, подсветка исчезает. : /

contini 27.11.2018 15:33

Создайте сервис sidenav, в котором вы создаете BehaviorSubject, который содержит текущее «меню», по которому вы перемещаетесь. В вашем шаблоне sidenav вы проверяете значение вашего объекта поведения и соответственно добавляете css-класс. Если вы не знаете, как это сделать, создайте небольшой стекблиц, буду рад помочь

Florian 27.11.2018 15:54

Я такой глупый! Я уже использую behaviorubject для выбранного пользователя, спасибо, что вспомнили, что я тоже использую его для пунктов меню: +1: работает!

contini 27.11.2018 16:12
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
10
309
0

Другие вопросы по теме