有条件地禁用Angular中的路由器链接

Yas*_*sir 0 router angular

我在Angular项目中有很多链接(使用Angular 2),类似于:

<a [routerLink]="..."
     [routerLinkActive]="..."
     [routerLinkActiveOptions]="...">
    Link
</a>
Run Code Online (Sandbox Code Playgroud)

我想根据上下文/状态禁用其中一些(通过更改颜色并防止操作发生)。


对于样式,我添加了链接:

[class.disabled]="!isValidLink()"
Run Code Online (Sandbox Code Playgroud)

这使我可以将链接显示为禁用状态,但仍然需要阻止路由。如果将a添加target="_self"到元素,它将阻止路由,但是我需要根据某些状态有条件地执行此操作。

是否有任何受支持的路由方式来执行此操作,或者是否有其他可行的实现方式?


编辑:pointer-events在CSS中设置为none可以防止单击链接,但是我正在寻找一种解决方案来防止键盘事件也触发它。

tar*_*s-d 6

禁用routerLink- replace onClick方法的另一种方法

为此,您必须创建指令:

import { Directive, Input, Optional } from '@angular/core';
import { RouterLink, RouterLinkWithHref } from '@angular/router';

@Directive({
    selector: '[routerLink][disableLink]'
})
export class DisableLinkDirective {

    @Input() disableLink: boolean;

    constructor(
        // Inject routerLink
        @Optional() routerLink: RouterLink,
        @Optional() routerLinkWithHref: RouterLinkWithHref
    ) {

        const link =  routerLink || routerLinkWithHref;

        // Save original method
        const onClick = link.onClick;

        // Replace method
        link.onClick = (...args) => {
            if (this.disableLink) {
                return routerLinkWithHref? false: true;
            } else {
                return onClick.apply(link, args);
            }
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

<a routerLink="/search" [disableLink]="!isLogged">Search</a>
Run Code Online (Sandbox Code Playgroud)

  • 广泛搜索不是解决方法但实际上有条件地停用 routerLink 的解决方案。就是这个。工作精美,使用起来非常简单。 (3认同)
  • 在 Angular 9 中仍然有效。这应该已经是路由器的默认属性。另外,这应该是我认为可以接受的答案。 (2认同)

elv*_*vin 2

像这样尝试一下:

<a [routerLink]="..."
    [class.disabled]="!isValidLink()" 
    (keydown.enter)="isValidLink()">Link</a>    
Run Code Online (Sandbox Code Playgroud)