首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular - routerLinkActive和queryParams处理

Angular - routerLinkActive和queryParams处理
EN

Stack Overflow用户
提问于 2017-08-02 11:06:52
回答 3查看 5.2K关注 0票数 9

更新2021年3月

Angular团队最终合并了PR,你可以在https://github.com/angular/angular/pull/40303上查看更多细节。

要使用它,简单地说

代码语言:javascript
复制
<div routerLinkActive="active-link" [routerLinkActiveOptions]="options">
</div>

其中options将具有IsActiveMatchOptions的形状

代码语言:javascript
复制
export declare interface IsActiveMatchOptions {
    fragment: 'exact' | 'ignored';
    matrixParams: 'exact' | 'subset' | 'ignored';
    paths: 'exact' | 'subset';
    queryParams: 'exact' | 'subset' | 'ignored';
}

或者简单地接受一个布尔型exact

代码语言:javascript
复制
{
   exact: boolean
}

原问题

我在Angular中使用routerLink,如下所示

代码语言:javascript
复制
<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标记中

代码语言:javascript
复制
/view/10?offset=0&numberOfItems=100

如果URL被offsetnumberOfItems更改为不同的值,则.active类将被删除,例如。

代码语言:javascript
复制
/view/10?offset=0&numberOfItems=120

我检查了angular docs,并设法通过添加另一个routerLink使其工作,但将其隐藏,如下所示。

代码语言:javascript
复制
<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工作吗?

EN

回答 3

Stack Overflow用户

发布于 2018-08-03 15:06:33

我遇到了同样的问题,但看起来这是根据这个https://github.com/angular/angular/issues/13205设计的

vsavkin是路由器的创建者。

票数 1
EN

Stack Overflow用户

发布于 2019-03-04 06:45:23

你可能会发现这个扩展RouterLinkActive很有帮助--如果一个项目包含一个字符串,那么它就是‘选定的’...

代码语言:javascript
复制
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;
  }

}
票数 1
EN

Stack Overflow用户

发布于 2021-02-15 03:05:13

该解决方案适用于Angular 11。将链接设置为活动,而不考虑不同的查询参数(仅比较段/路径)。

代码语言:javascript
复制
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工作):

代码语言:javascript
复制
<a ... rcRouterLinkActive="active" ...>Link text</a>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45450788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档