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

2024-02-09

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

<a [routerLink]="..."
     [routerLinkActive]="..."
     [routerLinkActiveOptions]="...">
    Link
</a>

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


对于样式,我已添加到链接:

[class.disabled]="!isValidLink()"

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

是否有任何支持的路由方式可以做到这一点,或者其他一些可行的实现?


Edit:环境pointer-eventscss 中的 none 会阻止点击链接,但我正在寻找一种解决方案来阻止键盘事件触发它。


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

为此,您必须创建指令:

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);
            }
        };
    }

}

Usage:

<a routerLink="/search" [disableLink]="!isLogged">Search</a>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有条件地禁用 Angular 中的路由器链接 的相关文章

随机推荐

  • 使用 bcrypt 生成的 Rails 密码是否可移植?

    我有一个现有的 Web 应用程序 有几千个用户 我正在将其移植到 Rails 当我重写和重构此应用程序时 我可能需要在任意数量的不同服务器上运行它以用于开发 测试和生产目的 我在我的用户模型中使用 Rails 的内置 has secure
  • 系统调用和陷阱之间的区别

    我想知道 MIPS 系统调用和陷阱指令之间是否有任何区别 我找不到任何涉及此的内容 所以我不确定是否有区别 陷阱似乎只是一个条件系统调用 但一些澄清可能会有所帮助 The SYSCALL and TRAP指令都会触发异常 但产生的异常是不同
  • 如何在 JavaScript 中为 Canvas 启用硬件加速

    如何在 JavaScript 中为 HTML5 画布启用硬件加速 或者说这在 JavaScript 中是不可能的吗 我记得我在某处读到过使用 CSS 或 Webgl 来做到这一点 但我不记得了 只要这个问题是关于 Canvas 的 java
  • 带有 shell 命令和变量的 c makefile

    这是来自我用来构建程序的 bash 脚本 dateString date Y m d H M S revision svn info grep Revision tr d alpha echo define VERSION DATE dat
  • API 什么时候会被过度设计? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • x 是 Javascript FF/Safari 中的保留关键字,而不是 IE 中的保留关键字吗?

    Web 应用程序的网页显示了一个奇怪的错误 我逐步删除了所有 HTML CSS JS 代码 得到了下面的基本且简单的代码
  • 使用 Python 和 SetWindowsHookExA 应用低级键盘挂钩

    所以我试图弄清楚如何使用 Python 注册全局键盘钩子 根据我的阅读 DLL 中没有回调似乎没问题 如果您使用WH KEYBOARD LL 我不能肯定地确认这一点 但我发现令人鼓舞的是 我没有像我尝试挂钩时那样收到 1428 错误WH C
  • 防止 Google App Engine Cron 作业创建多个实例(从而耗尽我所有的实例时间)

    与这个问题非常相关 如何防止我的 Google App Engine cron 作业耗尽我的所有实例时间 https stackoverflow com questions 8670532 how can i prevent my goog
  • 如何使用 knit/rmarkdown 自定义图形 LaTeX

    我想在通过 LaTeX 生成 pdf 文件的 rmarkdown 文档中使用 ggplot2 创建的图形在浮动中创建页脚 我的问题 rmarkdown knitr 中有没有办法在图形环境中添加更多 LaTeX 命令 具体来说 我想找到一种使
  • JPA 在使用 FlushModeType.AUTO 进行本机查询之前不会刷新

    在我们的项目中 我们使用hibernate 5 0 12和Spring data Jpa 我发现jpa不会在本机查询之前调用flush 但是在JPA规范中 我读到FlushModeType AUTO在每个查询 JPQL或本机SQL 之前调用
  • 如何在c中生成NaN浮点数?

    float f float a if f lt 0 else if f 0 else if f gt 0 else printf NaN n f不会大于 等于 小于0如果它是一个NaN 但如何生产这样的f首先 我尝试了各种方法来制作NaN
  • 捕获所有异常是好是坏?

    我在多个项目中看到一种捕获所有异常来捕获所有意外异常 这样应用程序就不会崩溃 我通常会看到这样的情况 AppDomain CurrentDomain UnhandledException new UnhandledExceptionEven
  • 从另一个类 swift 调用函数

    我无法从另一个类 Menu swift 调用 GameViewController swift 中的函数 我这样调用该函数 class Menu SKnode func scoreAction sender UIButton self bu
  • Django 视图被调用两次(双 GET 请求)

    我正在 Django 中创建一个分类网站 单一视图功能可处理全球列表 城市列表 仅易货全球列表和仅易货城市列表 这个视图被称为ads url 模式按以下顺序编写 请注意 每个模式都有唯一的名称 尽管它与相同的名称相关联 ads view u
  • 如何确定分配的 C 缓冲区的大小? [复制]

    这个问题在这里已经有答案了 我有一个缓冲区 想要进行测试以查看缓冲区是否有足够的容量 即找到可以添加到缓冲区的元素数量 char buffer char malloc sizeof char 10 Doing a int numElemen
  • iOS 中动画图像的最佳实践 - UIImage 还是 UIImageView?

    抱歉 如果问题有点主观 但我找不到有关该主题的任何信息 问题很简单 以下哪一项是 最佳 即最佳性能 无论选择什么解决方案 我都想在 UIImageView 中显示图像 self imageView image UIImage animate
  • .NET Rx 相对于经典事件的优势?

    NET 4 0 测试版 2 http msdn microsoft com en us vstudio dd582936 aspx has 介绍 http blogs msdn com bclteam archive 2009 10 21
  • 在控制器上声明 ViewBag

    我在控制器的方法中多次使用具有相同消息的 ViewBag Message 可以在类的顶部声明 ViewBag Message 这样就可以在整个控制器中使用而无需重复代码吗 假设 Razor 语法可以实现这一点 string pageMess
  • 使用数据库中的 jquery 动态复选框 html

    我有一些像这样的html div class control group div
  • 有条件地禁用 Angular 中的路由器链接

    我在 Angular 项目 使用 Angular 2 中有许多链接 类似于 a Link a 我想根据上下文 状态禁用其中一些 通过更改颜色并防止操作发生 对于样式 我已添加到链接 class disabled isValidLink 这让