如何有条件地禁用routerLink属性?

Tiz*_*noL 48 angular2-routing angular

在我的Angular 2应用程序中,我试图禁用routerLink而没有任何成功.我试图处理事件上的click事件click(使用event.preventDefault()event.stopPropagation()),但它不起作用.

如何禁用routerLink?

Gün*_*uer 79

禁用pointer-events

<a [routerlink]="xxx" [class.disabled]="disabled ? true : null">Link</a>

a.disabled {
   pointer-events: none;
   cursor: default;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Angular2,禁用锚元素的正确方法是什么?

要么

<a *ngIf="isEnabled" [routerlink]="xxx">Link</a>
<div *ngIf="!isEnabled">not a link</div>
Run Code Online (Sandbox Code Playgroud)

或者轻松重用已禁用的链接模板

<ng-template #disabledLink>
  <div *ngIf="!isEnabled">not a link</div>
</ng-template>
<a *ngIf="isEnabled; else disabledLink" [routerlink]="xxx">Link</a>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,它的确有效.我正在使用bootstrap为导航栏添加样式.禁用链接时,您的解决方案将删除`not-allowed`光标样式.我不得不另外添加它. (2认同)
  • @user3292624 仍然,IE 被认为是浏览器吗? (2认同)

Mar*_*der 47

无需禁用任何指针事件:

模板:

<a [routerLink]="homeLinkEnabled ? '/home' : null" routerLinkActive="is-active">Home</a>
Run Code Online (Sandbox Code Playgroud)

可选CSS:

.is-active {
    cursor: default;
    text-decoration: none;
}
Run Code Online (Sandbox Code Playgroud)

描述:

homeLinkEnabled回报false,null将使routerLink链接到当前的/活动的路线.

如果routerLink链接到活动路由,routerLinkActive则将应用指定的类.

在那里我们可以指定禁用的routerLink应该如何出现.

routerLink 到活动路线不会触发导航事件.

  • 这不是适当的解决方案,因为routerLink的空值被视为活动路由。 (6认同)

Cro*_*csx 7

所有最重要的答案都是解决方法。

最好的方法是您可以在此解决方案中找到的东西/sf/answers/3172624031/ by @taras-d

禁用 routerLink 的另一种方法 - 替换 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>


小智 5

我刚刚在类似的问题上取得了一些成功:在 ngFor 中有一系列导航链接,其中一些需要 [routerLink],而其他则需要(单击) - 我的问题是所有链接都依赖于 [routerLink] 来实现 [routerLinkActive] ,所以我不得不停止 routerLink,而不触及它的值。

`<a [routerLink]="item.link" routerLinkActive="isActive">
    <span (click)="item.click ? item.click($event) : void>
</a>`
Run Code Online (Sandbox Code Playgroud)

和:

`click: ($event) => {
    $event.stopPropagation(); // Only seems to
    $event.preventDefault(); // work with both
    // Custom onClick logic
}`
Run Code Online (Sandbox Code Playgroud)

由于跨度在内部,您可以确保事件的取消发生在它冒泡到 [routerLink] 之前,而 routerLinkActive 仍然适用。