当前位置: 首页 > 知识库问答 >
问题:

如何在锚点上有条件地使用[href]或[routerLink]?

毋宸
2023-03-14

我需要同一个锚链接有条件地指向本地或外部资源。我试过了

<a [href]="outside?externalUrl:null"  [routerLink]="outside?[]:['/route',id]" >test</a>

但是不管用。我没有得到任何错误,但它指向同一个本地页面,忽略了外部URL。有什么想法吗?

另一种选择是构建链接,但我找不到任何文档如何在服务内部访问路由器链接

编辑:我知道我可以用*ngIf克隆整个链接,但我不想这样做,我的链接包含一个带有一系列选项的视频标签

共有3个答案

丰智
2023-03-14

您可以通过在指令中注入 RouterLinkWithHref 来访问 routerLink 实例。

指令:

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

@Directive({
  selector: '[externalLink]'
})
export class ExternalLinkDirective implements OnChanges {

  @Input() externalLink: string;

  constructor(
    private el: ElementRef,
    @Optional() private link: RouterLinkWithHref
  ) {}

  ngOnChanges(){

    if (!this.link || !this.externalLink) {
      return;
    }
    this.el.nativeElement.href=this.link.href=this.externalLink;

    // Replace onClick
    this.link.onClick = (...args: any[]) => {
      return true;
    }

  }

}

用法:

html prettyprint-override"><!-- Ignore router link and use external link -->
<a routerLink="/some/path" externalLink="https://google.com">Link</a>
孔和畅
2023-03-14

对于条件href,在attr上前置。在href使用null值为我工作之前,就像这样:

[attr.href]="!item.subMenu ? item.url : null"
冀耀
2023-03-14

最简单的方法是使用 *ngIf / else

<ng-container *ngIf="outside; else internalBlock">
  <a [href]="externalUrl">External</a>
</ng-container>

<ng-template #internalBlock>
  <a [routerLink]="['/route', id]">Internal</a>
</ng-template>

编辑#1:(丑陋的解决方案)

既然不想用< code>*ngIf(我还是不明白为什么),可以这样做:

模板:

<a href="javascript:void(0)" (click)="handleClick(outside, '/route', id, externalUrl)">Link</a>

组成部分:

handleClick(outside: boolean, internalUrl: string, internalId: string, externalUrl: string): void {
  if (outside) {
    window.location.href = externalUrl;
    // You can also use Location class of Angular
  } else {
    this.router.navigate([`${internalUrl}/${internalId}`]);
  }
}
 类似资料:
  • 问题内容: 如何使用jQuery启用或禁用锚点? 问题答案: 为了防止锚跟随指定的位置,我建议使用:

  • 我在Spring中使用注释定义了使用cron样式模式的调度作业。 cron模式存储在配置属性文件中。实际上有两个属性文件:一个默认配置文件,一个与环境相关的配置文件(例如dev、test、prod customer1、prod customer2等)覆盖了一些默认值。 我在spring上下文中配置了一个属性占位符bean,它允许我使用样式的占位符从属性文件中导入值。 作业bean如下所示: 我的上

  • 问题内容: 我想做的是在有webclient的Webflux中的Mono上有条件地重复。情况如下: 我们有一些商务休息服务服务,可返回生成的文档。此文档的生成是由在此之前调用的另一服务触发的。但是,回到正题:文档生成服务需要10到30秒。我们想要做的是:10秒钟后检查是否生成文档(单声道)。如果是这样,一切都很好。如果不是,请在5秒钟后重复(或重试)并检查是否生成了文档。依此类推,直到(最坏的情况

  • 我要做的是用WebClient对Webflux中的单声道进行有条件的重复。情况如下: 我们有一些返回生成文档的业务rest服务。此文档的生成是从在此文档之前调用的另一个服务触发的。但是,回到业务:文档生成服务需要10-30秒。我们要做的是:10秒后检查是否生成了文档(单)。如果是这样,一切都很好。如果没有,请在5秒后重复(或重试)并检查是否生成了文档。以此类推,直到(最坏的情况)30秒后超时。这可

  • 我正在基于谷歌的hello_ar_java示例应用程序,围绕这个Agora ARcore演示构建我的应用程序。 此应用程序将捕获用户的点击,并检查是否在场景中找到任何平面。如果是,请在该点创建一个锚点。 我想在各种锚之间画一条线。 我在网上找到的所有东西都使用场景窗体和片段。 目前,我已经设法实现了没有arFraium但行不显示,可能是因为这种方法,我不知道如何取代没有arFrature: 要在我

  • 问题内容: 我正在使用注释在Spring中使用cron样式模式定义计划的作业。 Cron模式存储在配置属性文件中。实际上,有两个属性文件:一个默认配置,一个与环境相关的配置文件配置(例如dev,test,prod客户1,prod客户2等),并覆盖某些默认值。 我在春天的上下文中配置了一个属性占位符bean,这使我可以使用样式占位符从属性文件中导入值。 工作豆看起来像这样: 我的上下文XML的相关部