Angular 6:作为参数的子路由在进入参数 link 时不会更新
Angular 6 : Child route as parameter not updated whenever it goes to parameter link
问题:每当我点击第一个 link 它总是 select 两个 link.
我想知道如何更新 Angular 路由组件?
路由器Link:
{ path: 'gantt/:id', component: GanttWorkItemsComponent, data: { permission: 'Pages.WorkItems' } },
{ path: 'gantt', component: GanttWorkItemsComponent, data: { permission: 'Pages.WorkItems' } },
组件代码:
constructor(
injector: Injector,
private _http: Http,
private _workItemsServiceProxy: WorkItemsServiceProxy,
private _notifyService: NotifyService,
private _tokenAuth: TokenAuthServiceProxy,
private _activatedRoute: ActivatedRoute,
private _fileDownloadService: FileDownloadService,
private params: ActivatedRoute ) {
super(injector);
this._activatedRoute.params.subscribe(val => {
var paramId = params.snapshot.params["id"];
if (paramId) {
this.initiativeFilter = paramId;
this.nameFilter = 'strategy.id=' + this.initiativeFilter;
}
});
}
Html 模板:
<nav id="m_ver_menu"
class="{{ui.getSideBarMenuClass()}}"
data-menu-vertical="true"
[attr.data-menu-dropdown]="ui.getIsMenuDropdown()"
[attr.data-menu-scrollable]="ui.getIsMenuScrollable()"
data-menu-dropdown-timeout="500"
[attr.aria-label]="l('LeftMenu')">
<ul class="m-menu__nav {{ui.getMenuListClass()}}"
role="menubar"
[attr.aria-label]="l('LeftMenu')">
<ng-template ngFor let-menuItem [ngForOf]="menu.items" let-mainMenuItemIndex="index">
<li *ngIf="showMenuItem(menuItem)" routerLinkActive="m-menu__item--active" class="m-menu__item m-menu__item--submenu" [ngClass]="{'m-menu__item--expanded m-menu__item--open': menuItem.items.length > 0}" aria-haspopup="true" data-menu-submenu-toggle="hover">
<a [routerLink]="[menuItem.route]" *ngIf="!menuItem.items.length && !menuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[menuItem.route]" *ngIf="!menuItem.items.length && menuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" *ngIf="menuItem.items.length" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="menuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<ng-template ngFor let-childMenuItem [ngForOf]="menuItem.items" let-mainMenuItemIndex="index">
<li *ngIf="showMenuItem(childMenuItem)" routerLinkActive="m-menu__item--active" class="m-menu__item m-menu__item--submenu"
aria-haspopup="true"
data-menu-submenu-toggle="hover"
role="none">
<a [routerLink]="[childMenuItem.route]" *ngIf="!childMenuItem.items.length && !childMenuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childMenuItem.route]" *ngIf="!childMenuItem.items.length && childMenuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" class="m-menu__link m-menu__toggle" *ngIf="childMenuItem.items.length"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="childMenuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<!-- Menu Level 3 -->
<ng-template ngFor let-childOfChildMenuItem [ngForOf]="childMenuItem.items" let-childOfChildMenuItemIndex="index">
<li *ngIf="showMenuItem(childOfChildMenuItem)" routerLinkActive="m-menu__item--active " class="m-menu__item m-menu__item--submenu"
aria-haspopup="true"
role="none"
data-menu-submenu-toggle="hover">
<a [routerLink]="[childOfChildMenuItem.route]" *ngIf="!childOfChildMenuItem.items.length && !childOfChildMenuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childOfChildMenuItem.route]" *ngIf="!childOfChildMenuItem.items.length && childOfChildMenuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" class="m-menu__link m-menu__toggle" *ngIf="childOfChildMenuItem.items.length"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="childOfChildMenuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<!-- Menu Level 4 -->
<ng-template ngFor let-childOfChildOfChildMenuItem [ngForOf]="childOfChildMenuItem.items" let-childOfChildMenuItemIndex="index">
<li *ngIf="showMenuItem(childOfChildOfChildMenuItem)" routerLinkActive="m-menu__item--active " class="m-menu__item m-menu__item--submenu"
role="none">
<a [routerLink]="[childOfChildOfChildMenuItem.route]" *ngIf="!childOfChildOfChildMenuItem.external" class="m-menu__link"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildOfChildMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childOfChildOfChildMenuItem.route]" *ngIf="childOfChildOfChildMenuItem.external" class="m-menu__link" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildOfChildMenuItem.name)}}</span>
</span>
</a>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
我相信,每当第一个 link 命中一个时,它总是命中甘特图和参数的父路径。 tyff .. 和长列表都来自相同的组件和死记硬背,因此它从未更新参数一。每当我单击长列表时,它总是将长列表识别为长列表,但从来没有 select 是 tyffy 列表。
请帮我解决问题。
你需要在每里添加(使用routerLinkActive
的地方)[routerLinkActiveOptions]="{exact:true}"
使用它,您可以通过传递 exact: true 来配置 RouterLinkActive。这将仅在 url 与 link 完全匹配时添加 类。
所以你的代码应该像
<li *ngIf="showMenuItem(childOfChildMenuItem)" routerLinkActive="m-
menu__item--active" [routerLinkActiveOptions]="{exact:true}" class="m-
menu__item m-menu__item--submenu">
<a .... </a>
</li>
问题:每当我点击第一个 link 它总是 select 两个 link.
我想知道如何更新 Angular 路由组件?
路由器Link:
{ path: 'gantt/:id', component: GanttWorkItemsComponent, data: { permission: 'Pages.WorkItems' } },
{ path: 'gantt', component: GanttWorkItemsComponent, data: { permission: 'Pages.WorkItems' } },
组件代码:
constructor(
injector: Injector,
private _http: Http,
private _workItemsServiceProxy: WorkItemsServiceProxy,
private _notifyService: NotifyService,
private _tokenAuth: TokenAuthServiceProxy,
private _activatedRoute: ActivatedRoute,
private _fileDownloadService: FileDownloadService,
private params: ActivatedRoute ) {
super(injector);
this._activatedRoute.params.subscribe(val => {
var paramId = params.snapshot.params["id"];
if (paramId) {
this.initiativeFilter = paramId;
this.nameFilter = 'strategy.id=' + this.initiativeFilter;
}
});
}
Html 模板:
<nav id="m_ver_menu"
class="{{ui.getSideBarMenuClass()}}"
data-menu-vertical="true"
[attr.data-menu-dropdown]="ui.getIsMenuDropdown()"
[attr.data-menu-scrollable]="ui.getIsMenuScrollable()"
data-menu-dropdown-timeout="500"
[attr.aria-label]="l('LeftMenu')">
<ul class="m-menu__nav {{ui.getMenuListClass()}}"
role="menubar"
[attr.aria-label]="l('LeftMenu')">
<ng-template ngFor let-menuItem [ngForOf]="menu.items" let-mainMenuItemIndex="index">
<li *ngIf="showMenuItem(menuItem)" routerLinkActive="m-menu__item--active" class="m-menu__item m-menu__item--submenu" [ngClass]="{'m-menu__item--expanded m-menu__item--open': menuItem.items.length > 0}" aria-haspopup="true" data-menu-submenu-toggle="hover">
<a [routerLink]="[menuItem.route]" *ngIf="!menuItem.items.length && !menuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[menuItem.route]" *ngIf="!menuItem.items.length && menuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" *ngIf="menuItem.items.length" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
[attr.tabindex]="mainMenuItemIndex == 0 ? 0 : -1">
<i class="m-menu__link-icon {{menuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(menuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="menuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<ng-template ngFor let-childMenuItem [ngForOf]="menuItem.items" let-mainMenuItemIndex="index">
<li *ngIf="showMenuItem(childMenuItem)" routerLinkActive="m-menu__item--active" class="m-menu__item m-menu__item--submenu"
aria-haspopup="true"
data-menu-submenu-toggle="hover"
role="none">
<a [routerLink]="[childMenuItem.route]" *ngIf="!childMenuItem.items.length && !childMenuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childMenuItem.route]" *ngIf="!childMenuItem.items.length && childMenuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" class="m-menu__link m-menu__toggle" *ngIf="childMenuItem.items.length"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childMenuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="childMenuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<!-- Menu Level 3 -->
<ng-template ngFor let-childOfChildMenuItem [ngForOf]="childMenuItem.items" let-childOfChildMenuItemIndex="index">
<li *ngIf="showMenuItem(childOfChildMenuItem)" routerLinkActive="m-menu__item--active " class="m-menu__item m-menu__item--submenu"
aria-haspopup="true"
role="none"
data-menu-submenu-toggle="hover">
<a [routerLink]="[childOfChildMenuItem.route]" *ngIf="!childOfChildMenuItem.items.length && !childOfChildMenuItem.external" class="m-menu__link m-menu__toggle"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childOfChildMenuItem.route]" *ngIf="!childOfChildMenuItem.items.length && childOfChildMenuItem.external" class="m-menu__link m-menu__toggle" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
</a>
<a href="javascript:;" class="m-menu__link m-menu__toggle" *ngIf="childOfChildMenuItem.items.length"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildMenuItem.name)}}</span>
</span>
<i class="m-menu__ver-arrow la la-angle-right"></i>
</a>
<nav class="m-menu__submenu" *ngIf="childOfChildMenuItem.items.length" [attr.aria-label]="l(menuItem.name)">
<span class="m-menu__arrow"></span>
<ul class="m-menu__subnav"
[attr.aria-label]="l(menuItem.name)"
role="menu">
<!-- Menu Level 4 -->
<ng-template ngFor let-childOfChildOfChildMenuItem [ngForOf]="childOfChildMenuItem.items" let-childOfChildMenuItemIndex="index">
<li *ngIf="showMenuItem(childOfChildOfChildMenuItem)" routerLinkActive="m-menu__item--active " class="m-menu__item m-menu__item--submenu"
role="none">
<a [routerLink]="[childOfChildOfChildMenuItem.route]" *ngIf="!childOfChildOfChildMenuItem.external" class="m-menu__link"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildOfChildMenuItem.name)}}</span>
</span>
</a>
<a [attr.href]="[childOfChildOfChildMenuItem.route]" *ngIf="childOfChildOfChildMenuItem.external" class="m-menu__link" target="_blank"
role="menuitem"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1">
<i class="m-menu__link-icon {{childOfChildOfChildMenuItem.icon}}"></i>
<span class="m-menu__link-text">
<span class="title">{{l(childOfChildOfChildMenuItem.name)}}</span>
</span>
</a>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
</nav>
</li>
</ng-template>
</ul>
我相信,每当第一个 link 命中一个时,它总是命中甘特图和参数的父路径。 tyff .. 和长列表都来自相同的组件和死记硬背,因此它从未更新参数一。每当我单击长列表时,它总是将长列表识别为长列表,但从来没有 select 是 tyffy 列表。
请帮我解决问题。
你需要在每里添加(使用routerLinkActive
的地方)[routerLinkActiveOptions]="{exact:true}"
使用它,您可以通过传递 exact: true 来配置 RouterLinkActive。这将仅在 url 与 link 完全匹配时添加 类。
所以你的代码应该像
<li *ngIf="showMenuItem(childOfChildMenuItem)" routerLinkActive="m-
menu__item--active" [routerLinkActiveOptions]="{exact:true}" class="m-
menu__item m-menu__item--submenu">
<a .... </a>
</li>