更新2021年3月
Angular团队最终合并了PR,你可以在https://github.com/angular/angular/pull/40303上查看更多细节。
要使用它,简单地说
<div routerLinkActive="active-link" [routerLinkActiveOptions]="options">
</div>其中options将具有IsActiveMatchOptions的形状
export declare interface IsActiveMatchOptions {
fragment: 'exact' | 'ignored';
matrixParams: 'exact' | 'subset' | 'ignored';
paths: 'exact' | 'subset';
queryParams: 'exact' | 'subset' | 'ignored';
}或者简单地接受一个布尔型exact
{
exact: boolean
}原问题
我在Angular中使用routerLink,如下所示
<li routerLinkActive="active">
<a [routerLink]="['/view', 10]"
[queryParams]="{'offset': 0, 'numberOfItems': 100}"
queryParamsHandling="merge">
<div>View</div>
<div><span class="badge" [innerHtml]="viewCount"></span></div>
</a>
</li>因此,当URL看起来像这样时,.active类被添加到li标记中
/view/10?offset=0&numberOfItems=100如果URL被offset或numberOfItems更改为不同的值,则.active类将被删除,例如。
/view/10?offset=0&numberOfItems=120我检查了angular docs,并设法通过添加另一个routerLink使其工作,但将其隐藏,如下所示。
<li routerLinkActive="active">
<a [routerLink]="['/view', 10]"
[queryParams]="{'offset': 0, 'numberOfItems': 100}"
queryParamsHandling="merge">
<div>View</div>
<div><span class="badge" [innerHtml]="viewCount"></span></div>
</a>
<a [routerLink]="['/view', 10]" style="display:none;">
<div><span class="badge" [innerHtml]="viewCount"></span></div>
</a>
</li>看起来上面的方法有点不靠谱。当路由器参数带有可选的查询参数时,我可以设置什么配置来使routerLinkActive工作吗?
发布于 2018-08-03 15:06:33
我遇到了同样的问题,但看起来这是根据这个https://github.com/angular/angular/issues/13205设计的
vsavkin是路由器的创建者。
发布于 2019-03-04 06:45:23
你可能会发现这个扩展RouterLinkActive很有帮助--如果一个项目包含一个字符串,那么它就是‘选定的’...
import { Directive, Input, OnChanges, ElementRef, Renderer2, ChangeDetectorRef, SimpleChanges, Injector, AfterContentInit } from '@angular/core';
import { Router,RouterLinkActive, RouterLink, RouterLinkWithHref } from '@angular/router';
@Directive({
selector: '[routerLinkActiveQS]',
exportAs: 'routerLinkActiveQS'
})
export class RouterLinkQsactiveDirective extends RouterLinkActive implements OnChanges, AfterContentInit
{
@Input()
set routerLinkActiveQS(data: string[]|string) {
(<any>this).routerLinkActive = data;
}
@Input() routerLinkActiveQSContains : string;
constructor ( injector: Injector ) {
super ( injector.get(Router),injector.get(ElementRef),injector.get(Renderer2),injector.get(ChangeDetectorRef));
(<any>RouterLinkQsactiveDirective.prototype).isLinkActive = this.MyisLinkActive;
}
ngOnChanges(changes: SimpleChanges): void {
super.ngOnChanges(changes);
}
ngAfterContentInit(): void {
super.ngAfterContentInit();
}
private MyisLinkActive(router: Router): (link: (RouterLink|RouterLinkWithHref)) => boolean {
const result = (link: RouterLink | RouterLinkWithHref) => {
let resultInsde = router.isActive(link.urlTree, this.routerLinkActiveOptions.exact);
resultInsde = resultInsde || router.url.includes ( this.routerLinkActiveQSContains );
return resultInsde;
}
return result;
}
}发布于 2021-02-15 03:05:13
该解决方案适用于Angular 11。将链接设置为活动,而不考虑不同的查询参数(仅比较段/路径)。
import * as _ from 'lodash';
import {
AfterContentInit,
ChangeDetectorRef,
Directive,
ElementRef, Input,
OnChanges,
OnDestroy,
Optional,
Renderer2, SimpleChanges
} from '@angular/core';
import { Router, RouterLink, RouterLinkActive, RouterLinkWithHref } from '@angular/router';
@Directive({
selector: '[rcRouterLinkActive]',
exportAs: 'rcRouterLinkActive',
})
export class RcRouterLinkActiveDirective extends RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit {
@Input()
set rcRouterLinkActive(data: string[]|string) {
const classes = Array.isArray(data) ? data : data.split(' ');
(<any>this).classes = classes.filter(c => !!c);
}
constructor(
router: Router,
element: ElementRef,
renderer: Renderer2,
cdr: ChangeDetectorRef,
@Optional() link?: RouterLink,
@Optional() linkWithHref?: RouterLinkWithHref
) {
super(router, element, renderer, cdr, link, linkWithHref);
(<any>RcRouterLinkActiveDirective).prototype.isLinkActive = this.isRcLinkActive;
}
/**
* this method sets the link as active regardless of query params
* @param router
* @private
*/
private isRcLinkActive(router: Router): (link: (RouterLink|RouterLinkWithHref)) => boolean {
return (link: RouterLink|RouterLinkWithHref) =>{
const linkPath = '/' + link.urlTree.root.children.primary.segments.join('/');
return router.isActive(link.urlTree, this.routerLinkActiveOptions.exact) ||
_.startsWith(router.url, linkPath);
}
}
ngOnChanges(changes: SimpleChanges) {
super.ngOnChanges(changes);
}
ngOnDestroy() {
super.ngOnDestroy();
}
ngAfterContentInit() {
super.ngAfterContentInit();
}
}用法(作为标准angular的routerLinkActive工作):
<a ... rcRouterLinkActive="active" ...>Link text</a>https://stackoverflow.com/questions/45450788
复制相似问题