У меня есть боковая навигация, в которой есть раскрывающийся список. В нем вы можете выбрать пользователя. В зависимости от пользователя доступны разные пункты меню (без проблем). Если вы измените пользователя с помощью раскрывающегося списка (независимо от того, в каком пункте меню вы находитесь), вы должны быть перенаправлены на страницу сведений о пользователе (также работает).
Теперь к проблеме: если я нахожусь в подробном представлении для userA (пункт меню выделен) и меняю пользователя на userB, я (правильно) останусь в подробном представлении. URL-адрес изменится правильно, и в представлении отобразятся сведения для пользователя B. НО пункт меню больше не подсвечивается. Много пробовал, но пока ничего не работает.
Sidenode: я хотел бы изменить навигацию внутри службы, так как я хотел бы добавить больше логики и должен использовать ее также в других компонентах.
То, что у меня есть прямо сейчас (в значительной степени сокращено):
<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
selectionChange(): void {
this.userService.navigate();
}
navigate(): void {
this.router.navigate(['/user/' + this.user.id + '/details']);
}
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 был выделен, когда я нахожусь в этом представлении
ты имеешь в виду вот так? Подробно просмотреть this.subscriptions.push(this.route.paramMap.subscribe((m) => { this.userID = m.get('userID'); }));
в sidenav я уже получаю пользователя из сервиса.
Можете ли вы показать свой код, который выделяет «пункт меню»?
До сих пор использовался только [routerLinkActive] = "['active']" в теге atag в sidenav.html и стилизовал его с помощью css a.active {background-color: #FF0000}. К сожалению, класс active теряется при вызове router.navigate() по тому же URL-адресу с другим параметром userID. Похоже, я что-то не так делаю: /
active - это свойство css, срабатывающее при нажатии ссылки, поэтому я бы сказал, что поведение довольно нормальное. Могу подсказать: <mat-option *ngFor = "let u of user" [value] = "u" [ngStyle] = "{ 'background-color': u.id === userId ? '#FF0000' : 'none' }">
создайте переменную userId в своем компоненте sidenav и назначьте идентификатор своей переменной user в своем user.service
С вашим предложением ngStyle я только оформляю свой раскрывающийся список, верно? Но я хочу стилизовать выбранный пункт меню, извините, если это было неясно. У меня есть раскрывающийся список со всеми пользователями, а за пределами раскрывающегося списка у меня есть разные пункты меню, такие как Details, Projects, ... Когда я, например, страницу Projects, и я вызываю страницу Details через router.navigate(), пункт меню Detail выделяется. Если я уже использую Details, подсветка исчезает. : /
Создайте сервис sidenav, в котором вы создаете BehaviorSubject, который содержит текущее «меню», по которому вы перемещаетесь. В вашем шаблоне sidenav вы проверяете значение вашего объекта поведения и соответственно добавляете css-класс. Если вы не знаете, как это сделать, создайте небольшой стекблиц, буду рад помочь
Я такой глупый! Я уже использую behaviorubject для выбранного пользователя, спасибо, что вспомнили, что я тоже использую его для пунктов меню: +1: работает!





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