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


140

在Angular 1.x中,我可以执行以下操作来创建基本上不执行任何操作的链接:

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

但是,相同的标签会导航到Angular 2中的应用程序库。与Angular 2中的标签等效吗?

编辑:它看起来像是Angular 2路由器中的错误,现在在github上一个关于此的公开问题

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


你还是可以的。这只是html。有什么特殊用途吗?
萨斯加

是的,它仍然是有效的html,但与Angular 1.x的效果不同。
s.alem '16

1
您是否尝试过<a>不带“ html”的内容?
萨斯加

3
是的,但是浏览器不会以相同的方式对待它。我知道我可以使用CSS覆盖光标效果,并将指针分配给所有a标签。但这看起来很hack。
salem 2016年

3
我的意见是ng1方式是错误的方式(:默认行为应与标准html中的一样...
Sasxa

Answers:


187

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

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

进入

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

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

注意:如果要保留查询参数,则应将queryParamsHandlingoption 设置为preserve

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

2
这项工作[routerLink]=""使其<a href="null" (click)="myFunction()">My Link</a>在Chrome 64中呈现为
Angular5。– Zymotik,

3
我可以确认相同[routerLink]=""/ href="null"正在IE 11中工作
-Zymotik

1
<a [routerLink]="" (click)="passTheSalt()">点击我</a>在angular7中有效。我看到没有routerLInk的<a (click)="passTheSalt()">点击我</a>也可以在angular7中使用。什么是使用[routerLink]或不使用routerLink进行被动锚链接的更好方法?
伊恩·波斯顿·查弗

1
@IanPostonFramer删除后[routerLink]=""单击我的文本不会显示为链接,也不会显示手形光标图标。
Emiel Koning

5
注意:这将重置您的URL参数。买家当心。
Stavm

88

一样,没有任何相关的信息angular2。这是简单的html标签。

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

编辑

您可以href通过javascript:void(0)启用它来禁用它,这样就不会发生任何事情。(但它的hack)。我知道Angular 1提供了开箱即用的功能,现在看来对我来说不正确。

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

普伦克


其他方法可能是使用routerLink带有传递""值的指令,该值最终将生成空白href=""

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

@ s.alem您在说什么,拥有#内部锚点href可能会影响Angular1路线。.可能会将您发送到默认页面(如果存在)
Pankaj Parkar

我知道#在1.x角度的效果。我想要一个在angular2中不执行任何操作的链接,就像href=""在angular 1.x中一样。
s.alem '16

@ s.alem会这样做..但是<a href="">My Link</a>当前发生了什么?
Pankaj Parkar'Feb

1
[routerLink] =“”将从您的路线中删除查询参数,这可能不是您想要的。您可以使用保留查询参数,但这似乎太过分了
narthur157

2
但是,选项1:href="javascript:void(0);"对我有用。
保罗·卡尔顿

21

有多种方法可以使用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


支持全局解决方案,但是我不接受它作为正确答案,因为正如我所说,我只是在寻找一种开箱即用的解决方案,直到他们确认不会有任何解决方案,或者直到我真的需要它。但还是非常感谢你。
s.alem '16

2
问题pointer-events在于缺少对IE(caniuse)的支持(即使使用IE11,我也可以怪异地绕过它),并且它不能阻止从控制台中单击链接。我赞成@Pankaj答案,因为从我的角度来看这是最简单的答案,我的答案只是使用angular2的一种方式,我可以使其更简单,但css选择器受到限制。
埃里克·马丁内斯

1
这似乎破坏了引导程序选项卡链接(例如<a href="#tab-id">)
xd6_

引导程序功能在哪个模块中?
2017年

16

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

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

1
我喜欢这个解决方案。如果要让光标显示手,请添加style =“ cursor:pointer”。
newman

在许多情况下,这是一个很好的解决方案,但是请注意,按钮具有比仅基于文本的锚点更大的尺寸。
洋基

@yankee您可以在CSS中进行更改,但我不建议...实际上是,按钮是按钮,链接是链接...可悲的是,网络不是白色或黑色。
阿亚什(Ayyash)

11

我在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>

希望这可以帮助


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


5

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

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

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

您不应该在语义标记的意义​​上这样做。button如果您想doSomething在页面上使用元素。
MichaelKühnel17年

<button>space按下键时,元素默认触发点击。使用span(或<a>)会删除此功能-键盘操作将无法按预期进行
Drenai


4

以下是一些方法:

  • <a href="" (click)="false">Click Me</a>

  • <a style="cursor: pointer;">Click Me</a>

  • <a href="javascript:void(0)">Click Me</a>



3

您已阻止默认浏览器行为。但是您无需创建指令即可完成此操作。

如以下示例所示,这很容易:

my.component.html

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

my.component.ts

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

3

更新了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();
    }
  }
}

3

我有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>

0

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

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

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


0

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

在html中

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

在ts文件中

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

-1

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

-1

真正简单的解决方案是 (click)="(null)"

<a class="btn btn-default" (click)="(null)">Default</a>


也许有什么评论为什么这种技术不好?
grigson '16

1
当您不希望单击不好时,请在代码中到处编写单击
Jens Alenius

2
但这正是我想要做的:将代码中的位置标记为“单击时不可用”,但支持新语法。像onclick =“ javascript:void”这样的结构确实很难看。并且href =“#”是不可靠的,因为它们会将视口跳到顶部。所以我看不到更好的选择
grigson

我喜欢你的解决方案。谢谢。
MaiHữuLợi16年

检查我的新答案。如果您不希望achor浏览其按钮“类型”
Jens Alenius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.