ลิงก์แฝงในเชิงมุม 2 - <a href= คิดเห็น ”> เทียบเท่า


140

ใน Angular 1.x ฉันสามารถทำสิ่งต่อไปนี้เพื่อสร้างลิงค์ที่ไม่ทำสิ่งใดโดยพื้นฐาน:

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

แต่แท็กเดียวกันนำทางไปยังฐานแอพใน Angular 2 อะไรที่เทียบเท่ากันใน Angular 2

แก้ไข:ดูเหมือนว่าบั๊กในเราเตอร์ Angular 2 และตอนนี้มีปัญหาแบบเปิดบน githubเกี่ยวกับเรื่องนั้น

ฉันกำลังมองหาวิธีแก้ปัญหากล่องหรือยืนยันว่าจะไม่มี


คุณยังสามารถ มันเป็นเพียง html มีการใช้งานเฉพาะสำหรับมันหรือไม่
Sasxa

ใช่มันยังคงเป็น html ที่ถูกต้อง แต่เอฟเฟกต์จะไม่เหมือนกันกับ Angular 1.x
s.alem

1
คุณลอง<a>โดยไม่มี "html" ไหม
Sasxa

3
ใช่ แต่กว่าเบราว์เซอร์จะไม่จัดการกับมันในลักษณะเดียวกัน ฉันรู้ว่าฉันสามารถแทนที่คือผลเคอร์เซอร์กับ CSS และกำหนดตัวชี้ไปที่aแท็กทั้งหมด แต่มันดูแฮ็ค
s.alem

3
ความคิดเห็นของฉันคือวิธี ng1 เป็นวิธีที่ผิด (: พฤติกรรมเริ่มต้นควรเป็นตามที่อยู่ในมาตรฐาน html ...
Sasxa

คำตอบ:


187

หากคุณมี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>

2
สิ่งนี้ทำงาน[routerLink]=""ได้ดีในฐานะ<a href="null" (click)="myFunction()">My Link</a>Angular 5 ใน Chrome 64
Zymotik

3
ฉันยืนยันได้เหมือนกัน[routerLink]=""/ href="null"ทำงานใน IE 11
Zymotik

1
<a [routerLink Same="" (click)="passTheSalt()"> คลิกฉัน </a> ทำงานเป็น angular7 ฉันเห็น <a (click)="passTheSalt()"> คลิกฉัน </a> โดยไม่ต้องใช้ routerLInk ก็ทำงานในมุม 7 ด้วยเช่นกัน อะไรจะดีไปกว่าการสร้างลิงค์จุดยึดแบบพาสซีฟโดยใช้ [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>

Plunkr


อาจใช้วิธีอื่นโดยrouterLinkสั่งด้วย""ค่าผ่านซึ่งจะทำให้เกิดช่องว่างhref=""

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

@ s.alem สิ่งที่เคยพูดว่ามี#ภายในสมอhrefสามารถส่งผลกระทบต่อAngular1route..may ส่งให้คุณเริ่มต้นหน้า (มันมีถ้ามี)
Pankaj Parkar

1
ฉันรู้ว่าผลกระทบของ#ในเชิงมุม 1.x ฉันต้องการลิงค์ที่ไม่ทำอะไรเลยใน angular2 เช่นเดียวกับhref=""ในเชิงมุม 1.x
s.alem

@ s.alem <a href="">My Link</a>จะทำเช่นนั้น .. แต่เกิดอะไรขึ้นกับมันในปัจจุบัน?
Pankaj Parkar

1
[routerLink] = "" จะลบ params แบบสอบถามออกจากเส้นทางของคุณซึ่งอาจไม่ตรงตามที่คุณต้องการ คุณสามารถใช้เก็บรักษา
คิวรี

2
อย่างไรก็ตามตัวเลือกที่ 1: มันใช้href="javascript:void(0);"งานได้สำหรับฉัน
Paul Carlton

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_DIRECTIVE

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

นี่คือplnkrพร้อมตัวอย่างที่ใช้งานได้


โหวตขึ้นสำหรับโซลูชันระดับโลกและเชิงมุม แต่ฉันไม่ได้รับการยอมรับว่าเป็นคำตอบที่ถูกต้องเพราะอย่างที่ฉันพูดฉันแค่มองหาวิธีแก้ปัญหาเฉพาะในกล่องจนกว่าพวกเขาจะยืนยันว่าจะไม่มีหรือจนกว่าฉันจะต้องการจริงๆ มัน. แต่ก็ยังขอบคุณมาก
s.alem

2
ปัญหาที่เกิดขึ้นpointer-eventsคือการขาดการสนับสนุนกับ IE ( caniuse ) (ฉันสามารถข้ามมันได้แม้จะมี IE11 อย่างน่าประหลาดใจพอ) และมันก็ไม่ได้ป้องกันการคลิกที่ลิงค์จากคอนโซล ฉันได้รับคำตอบ @Pankaj เพราะมันเป็นสิ่งที่ง่ายที่สุดจากมุมมองของฉันคำตอบของฉันเป็นเพียงวิธีการทำกับ angular2 ฉันสามารถทำให้ง่ายขึ้น แต่ตัวเลือก CSS มี จำกัด
Eric Martinez

1
ดูเหมือนว่าจะแบ่งลิงก์แท็บ bootstrap (เช่น <a href="#tab-id">)
xd6_

โมดูลฟังก์ชั่น bootstrap มีระบบอะไร?
Jun711

16

ความปวดร้าวควรนำทางไปยังบางสิ่งดังนั้นฉันเดาว่าพฤติกรรมนั้นถูกต้องเมื่อมันผ่านเส้นทาง หากคุณต้องการสลับบางสิ่งบางอย่างในหน้ามันเป็นเหมือนปุ่ม? ฉันใช้ bootstrap ดังนั้นฉันสามารถใช้สิ่งนี้:

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

1
ฉันชอบวิธีนี้ หากคุณต้องการให้เคอร์เซอร์แสดงมือให้เพิ่ม style = "cursor: pointer"
นิวแมน

ในหลายสถานการณ์ทางออกที่ดีอย่างไรก็ตามโปรดทราบว่าปุ่มนั้นมีขนาดที่ใหญ่กว่าตัวยึดข้อความ
yankee

@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 นี้ในstyles.cssไฟล์ระดับบนสุดของโครงการ Angular และมันจะทำงานได้ดีมาก!


5

ทางออกที่ง่ายจริงๆคือไม่ใช้แท็ก - ใช้การขยายแทน:

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

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

คุณไม่ควรทำอย่างนั้นในแง่ของมาร์กอัป sematic ใช้buttonองค์ประกอบในกรณีที่คุณต้องการdoSomethingในหน้า
Michael Kühnel

<button>องค์ประกอบทริกเกอร์คลิกโดยค่าเริ่มต้นเมื่อspaceกดปุ่ม การใช้span(หรือ<a>) ลบคุณลักษณะนี้ - ดังนั้นการกระทำของแป้นพิมพ์จะไม่ทำงานตามที่คาดไว้
Drenai

4

นี่เป็นวิธีง่ายๆ

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

จับเหตุการณ์เดือดและยิงมันลง


ทำไมไม่ใช้จุดยึดเพื่อป้องกันพฤติกรรมเริ่มต้น เช่นเดียวกับที่อธิบายไว้ที่นี่: stackoverflow.com/a/44465069/702783 ดูเหมือนน้อย»แฮ็ค«กับฉัน
Michael Kühnel

4

นี่คือวิธีที่จะทำ:

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

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

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


3

ในกรณีของฉันการลบแอตทริบิวต์ href แก้ปัญหาตราบใดที่มีฟังก์ชั่นคลิกกำหนดให้


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 วิธีแก้ปัญหาสำหรับ Dummy anchor tag

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

4. หากคุณใช้ bootstrap:

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


อาจมีข้อคิดเห็นใด ๆ ทำไม technick ดังกล่าวไม่ดี
กริกสัน

1
คลิกเขียนทุกที่ในรหัสเมื่อคุณไม่ต้องการให้คลิกไม่ดี
Jens Alenius

2
แต่นี่คือสิ่งที่ฉันต้องการ: ทำเครื่องหมายด้วยรหัสว่า "nothing-on-click" สามารถทำได้ แต่รองรับไวยากรณ์ใหม่ สิ่งปลูกสร้างเช่น onclick = "javascript: void" ช่างน่าเกลียดจริงๆ และ href = "#" ไม่น่าเชื่อถือเนื่องจากสามารถข้ามวิวพอร์ตของคุณไปด้านบน ดังนั้นฉันจึงไม่เห็นทางเลือกที่ดีกว่านี้อีกแล้ว
กริกสัน

ฉันชอบทางออกของคุณ ขอบคุณ.
Mai HữuLợi

ตรวจสอบคำตอบใหม่ของฉัน หากคุณไม่ต้องการให้ achor นำทางปุ่ม 'type'
Jens Alenius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.