ChatGPT解决这个技术问题 Extra ChatGPT

Angular 2 中的被动链接 - <a href=""> 等效项

在 Angular 1.x 中,我可以执行以下操作来创建一个基本上什么都不做的链接:

<a href="">My Link</a>

但是同一个标签在 Angular 2 中导航到应用程序库。在 Angular 2 中,它的等价物是什么?

编辑:它看起来像 Angular 2 路由器中的一个错误,现在有an open issue on github关于它。

我正在寻找开箱即用的解决方案或确认不会有任何解决方案。

你还是可以的。这只是html。它有什么特别的用途吗?
是的,它仍然是有效的 html,但效果与 Angular 1.x 不同。
您是否只尝试了没有“html”的 <a>
是的,但是浏览器不会以同样的方式对待它。我知道我可以用 css 覆盖即光标效果,并将指针分配给所有 a 标记。但这看起来很老套。
我的观点是 ng1 方式是错误的方式(:默认行为应该与标准 html 中的一样......

s
s.alem

如果您有 Angular 5 或更高版本,只需更改

<a href="" (click)="passTheSalt()">Click me</a>

进入

<a [routerLink]="" (click)="passTheSalt()">Click me</a>

将鼠标悬停在链接上时将显示带有手形图标的链接,单击它不会触发任何路线。

注意:如果要保留查询参数,应将 queryParamsHandling 选项设置为 preserve

<a [routerLink]=""
   queryParamsHandling="preserve"
   (click)="passTheSalt()">Click me</a>

这工作 [routerLink]="" 它在 Chrome 64 中呈现为 <a href="null" (click)="myFunction()">My Link</a> Angular 5。
我可以确认相同的 [routerLink]="" / href="null" 在 IE 11 中工作
点击我 在 angular7 中工作。我看到 Click me 没有 routerLInk 也可以在 angular7 中工作。使用 [routerLink] 或不使用 routerLink 建立被动锚链接的更好方法是什么?
@IanPostonFramer 当我删除 [routerLink]="" 时,文本 Click me 不会显示为链接,也不会显示手形光标图标。
注意:这将重置您的 URL 参数。买家小心。
P
Pankaj Parkar

这将是相同的,它没有与 angular2 相关的任何内容。它是简单的 html 标签。

基本上 a(anchor) 标记将由 HTML 解析器呈现。

编辑

您可以通过在其上添加 javascript:void(0) 来禁用该 href,这样就不会发生任何事情。 (但它的黑客)。我知道 Angular 1 开箱即用地提供了这个功能,这对我来说现在似乎不正确。

<a href="javascript:void(0)" >Test</a>

Plunkr

其他方式可能是使用 routerLink 指令并传递 "" 值,最终将生成空白 href=""

<a routerLink="" (click)="passTheSalt()">Click me</a>

@s.alem 你在说什么,在锚点 href 内有 # 可能会影响 Angular1 路由..可能会将您发送到默认页面(如果它在那里)
我知道 # 在角度 1.x 中的效果。我想要一个在 angular2 中什么都不做的链接,就像 angular 1.x 中的 href=""
@s.alem 所以 <a href="">My Link</a> 会这样做..但它目前发生了什么?
[routerLink]="" 将从您的路由中删除查询参数,这可能不是您想要的。您可以使用保留查询参数,但这似乎太过分了
但是,选项 1:href="javascript:void(0);" 对我有用。
E
Eric Martinez

有一些方法可以用 angular2 来做,但我强烈不同意这是一个错误。我不熟悉 angular1,但这似乎是一个非常错误的行为,即使您声称在某些情况下很有用,但显然这不应该是任何框架的默认行为。

除了不同意,您可以编写一个简单的指令来获取所有链接并检查 href 的内容,如果它的长度为 0,则执行 preventDefault(),这是一个小示例。

@Directive({
  selector : '[href]',
  host : {
    '(click)' : 'preventDefault($event)'
  }
})
class MyInhertLink {
  @Input() href;
  preventDefault(event) {
    if(this.href.length == 0) event.preventDefault();
  }
}

您可以通过在 PLATFORM_DIRECTIVES 中添加此指令使其在您的应用程序中工作

bootstrap(App, [provide(PLATFORM_DIRECTIVES, {useValue: MyInhertLink, multi: true})]);

这是一个 plnkr,其中包含一个工作示例。


支持一个全局的、有角度的解决方案,但我不接受它作为正确的答案,因为正如我所说,我只是在寻找一个开箱即用的解决方案,直到他们确认不会有任何解决方案或直到我真的需要它。但还是非常感谢你。
pointer-events 的问题是缺乏对 IE (caniuse) 的支持(即使使用 IE11 我也可以绕过它),并且它不会阻止从控制台单击链接.我赞成@Pankaj 的答案,因为从我的角度来看,这是最简单的答案,我的答案只是使用 angular2 的一种方法,我可以让它更容易,但 css 选择器是有限的。
这似乎破坏了引导选项卡链接(例如
引导功能在哪个模块中?
J
Jens Alenius

一个锚应该导航到某个东西,所以我猜它路由时的行为是正确的。如果您需要它来切换页面上的某些内容,它更像是一个按钮?我使用引导程序,所以我可以使用它:

<button type="button" class="btn btn-link" (click)="doSomething()">My Link</button>

我喜欢这个解决方案。如果你想让光标显示手,添加 style="cursor:pointer"。
在许多情况下,这是一个很好的解决方案,但是请注意,按钮的尺寸比基于文本的锚点更大。
@yankee你可以在css中改变它,但我不推荐......事实上,一个按钮是一个按钮,一个链接是一个链接......太可悲的是网络不是那么白或黑。
S
Sabri Aziri

我在 css 中使用了这个解决方法:

/*** Angular 2 link without href ***/
a:not([href]){
    cursor: pointer; 
    -webkit-user-select: none; 
    -moz-user-select: none; 
    user-select: none
}

html

<a [routerLink]="/">My link</a>

希望这可以帮助


这是一个更好的解决方案,因为它主要是缺少视觉效果。您可以将此 CSS 放在 Angular 项目的顶级 styles.css 文件中,它会很好用!
a
ali-myousefi

simeyla solution

<a href="#" (click)="foo(); false">
<a href="" (click)="false">

这似乎是最简单和最优雅的解决方案。
简单的回答👍
只需在函数中返回 false,那么您不必在使用该函数的每个标签中记住它。
S
Sal

以下是一些方法:

点我

点击我

点击我


M
Michael Kühnel

您已阻止默认浏览器行为。但是你不需要创建一个指令来完成它。

这很简单,如下例所示:

我的.component.html

<a href="" (click)="goToPage(pageIndex, $event)">Link</a>

我的.component.ts

goToPage(pageIndex, event) {
  event.preventDefault();
  console.log(pageIndex);
}

这将遍历更新并且不处理 routerlink 或 null 值。
b
born2net

这是一个简单的方法

  <div (click)="$event.preventDefault()">
            <a href="#"></a>
   </div>

捕捉冒泡事件并将其击落


为什么不使用锚本身来防止默认行为?就像这里描述的那样:stackoverflow.com/a/44465069/702783 对我来说似乎不那么“hacky”。
F
FiniteLooper

为 Angular 5 更新

import { Directive, HostListener, Input } from '@angular/core';

@Directive({
  // tslint:disable-next-line:directive-selector
  selector : '[href]'
})
export class HrefDirective {
  @Input() public href: string | undefined;

  @HostListener('click', ['$event']) public onClick(event: Event): void {
    if (!this.href || this.href === '#' || (this.href && this.href.length === 0)) {
      event.preventDefault();
    }
  }
}

M
Michał Ignaszewski

在我的情况下,只要有一个 click 函数分配给 a,删除 href 属性就可以解决问题。


N
Nabin Kumar Khatiwada

我有 4 种虚拟锚标签的解决方案。

    1. <a style="cursor: pointer;"></a>
    2. <a href="javascript:void(0)" ></a>
    3. <a href="current_screen_path"></a>

4.如果您使用的是引导程序:

<button class="btn btn-link p-0" type="button" style="cursor: pointer"(click)="doSomething()">MY Link</button>

S
Shrike

不知道为什么人们建议使用 routerLink="",对我来说,在 Angular 11 中它会触发导航。这对我有用:

<div class="alert">No data yet, ready to <a href="#" (click)="create();$event.preventDefault()">create</a>?</div>

J
Jonathan

一个非常简单的解决方案是不使用 A 标签 - 使用 span 代替:

<span class='link' (click)="doSomething()">Click here</span>

span.link {
  color: blue;
  cursor: pointer;
  text-decoration: underline;
}

你不应该在语义标记的意义上这样做。如果您想在页面上doSomething,请使用 button 元素。
<button> 元素在按下 space 键时默认触发点击。使用 span(或 <a>)删除此功能 - 因此键盘操作不会按预期工作
是的,我很欣赏这个解决方案,但这破坏了我们许多人的可访问性
这永远不是正确的解决方案。跨度用于格式化文本、用于链接的锚点和导航,可访问性工具以不同方式处理这些。
U
U_R_Naveen UR_Naveen

您需要防止事件的默认行为如下。

在 html 中

<a href="" (click)="view($event)">view</a>

在 ts 文件中

view(event:Event){
 event.preventDefault();
 //remaining code goes here..
}

M
Monster Brain

我想知道为什么没有人建议 routerLink 和 routerLinkActive (Angular 7)

<a [routerLink]="[ '/resources' ]" routerLinkActive="currentUrl!='/resources'">

我删除了href,现在使用它。使用 href 时,它会转到基本 url 或重新加载相同的路由。


g
geejay

为 Angular2 RC4 更新:

import {HostListener, Directive, Input} from '@angular/core';

@Directive({
    selector: '[href]'
})
export class PreventDefaultLinkDirective {

    @Input() href;
    @HostListener('click', ['$event']) onClick(event) {this.preventDefault(event);}

    private preventDefault(event) {
        if (this.href.length === 0 || this.href === '#') {
            event.preventDefault();
        }
    }
}

使用

bootstrap(App, [provide(PLATFORM_DIRECTIVES, {useValue: PreventDefaultLinkDirective, multi: true})]);