Angular 2のパッシブリンク-<a href=“”>相当


140

Angular 1.xでは、基本的に何もしないリンクを作成するために次のことができます。

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

しかし、同じタグがAngular 2のアプリベースに移動します。Angular2のそれに相当するものは何ですか?

編集: Angular 2ルーターのバグのようですが、githubに未解決の問題あります

すぐに使えるソリューション、またはそれがないことの確認を探しています。


まだできます。それは単なるhtmlです。それの特定の用途は?
Sasxa 2016

はい、まだ有効なhtmlですが、効果はAngular 1.xと同じではありません。
s.alem 2016

1
<a>「html」なしでを試してみましたか?
Sasxa、2016

3
ええ、でもブラウザは同じように扱いません。つまり、CSSを使用してカーソル効果をオーバーライドし、すべてのaタグにポインターを割り当てることができることを知っています。しかし、それはハックに見えます。
s.alem 2016

3
私の意見では、ng1の方法は間違った方法でした(:デフォルトの動作は、標準のhtmlの場合と
同じ

回答:


187

お持ちの場合は角度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>

2
これは、働いていた[routerLink]=""として、それがレンダリング<a href="null" (click)="myFunction()">My Link</a>クローム64にアンギュラ5
Zymotik

3
私は同じことを確認できます[routerLink]=""/ href="null"IE 11で動作しています
Zymotik

1
<a [routerLink]="" (click)="passTheSalt()"> Click me </a>はangular7で動作します。routerLInkなしで<a (click)="passTheSalt()"> Click me </a>がangular7でも機能することを確認しました。[routerLink]またはrouterLinkを使用せずにパッシブアンカーリンクを作成するより良い方法は何ですか?
Ian Poston Framer

1
@IanPostonFramerを削除する[routerLink]=""と、「クリックしてください」というテキストがリンクとして表示されず、ハンドカーソルアイコンが表示されません。
Emiel Koning

5
注意:これにより、URLパラメータがリセットされます。バイヤーは注意してください。
Stavm

88

同じですが、に関連するものはありませんangular2。シンプルなhtmlタグです。

基本的にa(アンカー)タグはHTMLパーサーによってレンダリングされます。

編集する

あなたはそれを無効にすることができhrefたことにより、javascript:void(0)何がそれに起こりませんので、それに。(しかし、そのハック)。Angular 1がこの機能を箱から出して提供したことは知っています。

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

プランカー


他の方法では、最終的に空白を生成する値をrouterLink渡すディレクティブを使用することができます""href=""

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

@ s.alem何を言っていても、#内部アンカーhrefがあるとAngular1ルートに影響を与える可能性があります。デフォルトページに移動する場合があります(ある場合)
Pankaj Parkar

#はangular 1.xでの影響を知っています。angular1.xのようhref=""に、angular2では何もしないリンクが必要です。
s.alem 2016

@ s.alemそれでそれを<a href="">My Link</a>するでしょう..しかし、現在それで何が起こっていますか?
Pankaj Parkar 2016

1
[routerLink] = ""は、クエリパラメータをルートから削除します。これは、おそらく望んでいることではありません。クエリ
パラメータの

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 2016

2
の問題pointer-eventsは、IE(caniuse)のサポートが不足していること(私はIE11でさえ奇妙にバイパスできる)であり、コンソールからリンクをクリックすることを妨げません。@Pankajの回答を賛成しました。これは私の観点からは最も簡単な回答です。私の回答は、angular2を使用して行う方法の1つであり、簡単にすることができますが、CSSセレクターは制限されています。
Eric Martinez、

1
これは、ブートストラップタブリンク(<a href="#tab-id">など)を壊すようです
xd6_

どのモジュールにブートストラップ機能がありますか?
Jun711、2017

16

アコーは何かにナビゲートする必要があるので、ルーティングしたときの動作は正しいと思います。ページで何かを切り替える必要がある場合は、ボタンのようなものですか?私はこれを使用できるようにブートストラップを使用します:

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

1
私はこのソリューションが好きです。カーソルが手を表示するようにしたい場合は、style = "cursor:pointer"を追加します。
ニューマン2017

ただし、多くの状況では適切な解決策ですが、ボタンのサイズはテキストベースのアンカーよりも大きいことに注意してください。
ヤンキー

@ヤンキーあなたは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 class='link' (click)="doSomething()">Click here</span>

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

セマティックマークアップの意味でこれを行うべきではありません。ページに表示buttonする場合は、要素を使用doSomethingします。
MichaelKühnel2017年

<button>要素spaceは、キーが押されたときにデフォルトでクリックをトリガーします。span(または<a>)を使用すると、この機能が削除され、キーボードアクションが期待どおりに機能しなくなります
Drenai

4

ここに簡単な方法があります

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

バブリングイベントをキャプチャして撃ち落とす


デフォルトの動作を防止するためにアンカー自体を使用しないのはなぜですか?ここで説明したように:stackoverflow.com/a/44465069/702783 あまり「ハッキー」ではないようです。
MichaelKühnel2017年

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>


なぜそのようなテクニックが悪いのかコメントがありますか?
グリソン16

1
クリックしたくないときにコード内のどこにでもクリックを書き込むのは悪いことです
Jens Alenius

2
しかし、これはまさに私がやりたいことです。コード内の場所を「クリック時に何もできない」ものとしてマークしますが、新しい構文をサポートします。onclick = "javascript:void"のような構成は本当に醜いです。また、href = "#"はビューポートを上にジャンプする可能性があるため、信頼性が低くなります。だから私はより良い代替案を見ることができません
グリグソン'22

私はあなたの解決策が好きです。ありがとうございました。
MaiHữuLợi16年

私の新しい答えを確認してください。アコーにボタンの「タイプ」をナビゲートさせたくない場合
イェンス・アレニウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.