Liên kết thụ động trong Angular 2 - tương đương <a href= Khác


140

Trong Angular 1.x tôi có thể làm như sau để tạo một liên kết mà về cơ bản không có gì:

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

Nhưng cùng một thẻ điều hướng đến cơ sở ứng dụng trong Angular 2. Tương đương với thẻ đó trong Angular 2 là gì?

Chỉnh sửa: Có vẻ như một lỗi trong Bộ định tuyến Angular 2 và bây giờ có một vấn đề mở trên github về điều đó.

Tôi đang tìm kiếm một giải pháp vượt trội hoặc xác nhận rằng sẽ không có giải pháp nào.


Bạn vẫn có thể. Nó chỉ là html. Bất kỳ sử dụng cụ thể cho nó?
Sasxa

Vâng, nó vẫn là html hợp lệ, nhưng hiệu ứng không giống với Angular 1.x.
s.alem

1
Bạn đã thử chỉ <a>, không có "html"?
Sasxa

3
Vâng, nhưng hơn trình duyệt không xử lý nó theo cùng một cách. Tôi biết tôi có thể ghi đè tức là hiệu ứng con trỏ bằng css và gán con trỏ cho tất cả acác thẻ. Nhưng điều đó có vẻ hacky.
s.alem

3
Ý kiến ​​của tôi là cách ng1 là cách sai (: Hành vi mặc định phải như trong tiêu chuẩn html ...
Sasxa

Câu trả lời:


187

Nếu bạn có Angular 5 trở lên, chỉ cần thay đổi

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

vào

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

Một liên kết sẽ được hiển thị với một biểu tượng bàn tay khi di chuột qua nó và nhấp vào nó sẽ không kích hoạt bất kỳ tuyến đường nào.

Lưu ý: Nếu bạn muốn giữ các tham số truy vấn, bạn nên đặt queryParamsHandlingtùy chọn thành preserve:

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

2
Điều này hoạt động, [routerLink]=""nó được gọi là <a href="null" (click)="myFunction()">My Link</a>Angular 5 trong Chrome 64.
Zymotik

3
Tôi có thể xác nhận tương tự [routerLink]=""/ href="null"đang hoạt động trong IE 11
Zymotik

1
<a [routerLink[="" (click)="passTheSalt()"> Nhấp vào tôi </a> hoạt động trong angular7. Tôi thấy <a (click)="passTheSalt()"> Nhấp vào tôi </a> mà không có bộ định tuyếnLInk cũng hoạt động trong angular7. cách tốt hơn để tạo liên kết neo thụ động bằng [routerLink] hoặc không có routerLink là gì?
Ian Poston Framer

1
@IanPostonFramer Khi tôi xóa [routerLink]="", văn bản Nhấp vào tôi không được hiển thị dưới dạng liên kết và không hiển thị biểu tượng con trỏ tay.
Emiel Koning

5
THÔNG BÁO: điều này sẽ thiết lập lại thông số URL của bạn. người mua hãy cẩn thận.
Stavm

88

Điều đó sẽ giống nhau, nó không có gì liên quan angular2. Đây là thẻ html đơn giản.

Về cơ bản, athẻ (neo) sẽ được hiển thị bởi trình phân tích cú pháp HTML.

Biên tập

Bạn có thể vô hiệu hóa điều đó hrefbằng cách có javascript:void(0)nó để không có gì xảy ra với nó. (Nhưng hack của nó). Tôi biết Angular 1 đã cung cấp chức năng này ngay lập tức mà dường như không đúng với tôi.

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

Plunkr


Cách khác có thể được sử dụng, routerLinkchỉ thị với ""giá trị chuyển qua mà cuối cùng sẽ tạo ra trốnghref=""

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

@ s.alem những gì bạn đang nói, việc có #bên trong neo hrefcó thể ảnh hưởng đến Angular1tuyến đường..may gửi bạn đến trang mặc định (nếu có)
Pankaj Parkar

Tôi biết tác dụng của #góc 1.x. Tôi muốn một liên kết không có gì trong angular2, giống như href=""trong angular 1.x.
s.alem

@ s.alem vì vậy <a href="">My Link</a>sẽ làm điều đó..nhưng những gì đang xảy ra với nó?
Pankaj Parkar

1
[routerLink] = "" sẽ xóa tham số truy vấn khỏi tuyến đường của bạn, đây có thể không phải là điều bạn muốn. Bạn có thể sử dụng thông số truy vấn bảo tồn, nhưng điều này có vẻ như đi quá xa
narthur157

2
Tuy nhiên, tùy chọn 1: href="javascript:void(0);"DOES làm việc cho tôi.
Paul Carlton

21

Có nhiều cách để làm điều đó với angular2, nhưng tôi hoàn toàn không đồng ý đây là một lỗi. Tôi không quen thuộc với angular1, nhưng điều này có vẻ như là một hành vi thực sự sai mặc dù bạn cho rằng nó hữu ích trong một số trường hợp, nhưng rõ ràng đây không phải là hành vi mặc định của bất kỳ khuôn khổ nào.

Không đồng ý, bạn có thể viết một chỉ thị đơn giản lấy tất cả các liên kết của bạn và kiểm tra hrefnội dung của nó và nếu độ dài của nó là 0 bạn thực thi preventDefault(), đây là một ví dụ nhỏ.

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

Bạn có thể làm cho nó hoạt động trên ứng dụng của mình bằng cách thêm chỉ thị này vào PLATFORM_DIRECTIVES

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

Đây là một plnkr với một ví dụ hoạt động.


Nâng cao giải pháp toàn cầu, góc cạnh, nhưng tôi không chấp nhận đó là câu trả lời chính xác vì như tôi đã nói, tôi chỉ tìm kiếm một giải pháp bên ngoài, cho đến khi họ xác nhận sẽ không có hoặc cho đến khi tôi thực sự cần nó Nhưng vẫn cảm ơn bạn rất nhiều.
s.alem

2
Vấn đề với pointer-eventslà thiếu sự hỗ trợ với IE ( caniuse ) (tôi có thể bỏ qua nó ngay cả với IE11 đủ kỳ lạ), và nó không ngăn được nhấp vào liên kết từ bảng điều khiển. Tôi đã đưa ra câu trả lời @Pankaj vì đây là câu trả lời dễ nhất theo quan điểm của tôi, câu trả lời của tôi chỉ là cách thực hiện với angular2, tôi có thể làm cho nó dễ dàng hơn nhưng bộ chọn css bị hạn chế.
Eric Martinez

1
Điều này dường như phá vỡ các liên kết bootstrap tab (như <a href="#tab-id">)
xd6_

Mô-đun nào là chức năng bootstrap trong?
Jun711

16

Một cơn đau nên điều hướng đến một cái gì đó, vì vậy tôi đoán hành vi này là chính xác khi nó định tuyến. Nếu bạn cần nó để chuyển một cái gì đó trên trang, nó giống nút hơn? Tôi sử dụng bootstrap để tôi có thể sử dụng:

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

1
Tôi thích giải pháp này. Nếu bạn muốn có con trỏ để hiển thị một bàn tay, hãy thêm style = "con trỏ: con trỏ".
newman

Trong nhiều tình huống, một giải pháp tốt, tuy nhiên, hãy lưu ý rằng nút có kích thước lớn hơn chỉ là neo dựa trên văn bản.
yankee

@yankee bạn có thể thay đổi điều đó trong css, nhưng tôi không khuyến khích ... thực tế là, một nút là một nút và một liên kết là một liên kết ... thật buồn vì web không phải là màu trắng hay đen.
Ayyash

11

Tôi đang sử dụng cách giải quyết này với 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>

Hi vọng điêu nay co ich


1
Đây là một giải pháp tốt hơn vì nó chủ yếu là một hiệu ứng hình ảnh bị thiếu. Bạn có thể đặt CSS này vào styles.csstệp cấp cao nhất của dự án Angular và nó sẽ hoạt động rất tốt!


5

Một giải pháp thực sự đơn giản là không sử dụng thẻ A - thay vào đó hãy sử dụng một khoảng:

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

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

Bạn không nên làm điều đó theo nghĩa đánh dấu ngữ nghĩa. Sử dụng một buttonyếu tố trong trường hợp bạn muốn doSomethingtrên trang.
Michael Kühnel

<button>các yếu tố kích hoạt nhấp theo mặc định khi spacenhấn phím. Việc sử dụng span(hoặc <a>) sẽ loại bỏ tính năng này - vì vậy các hành động trên bàn phím sẽ không hoạt động như mong đợi
Drenai

4

Đây là một cách đơn giản

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

nắm bắt sự kiện sủi bọt và bắn hạ nó


Tại sao không sử dụng chính neo để ngăn chặn hành vi mặc định? Giống như được mô tả ở đây: stackoverflow.com/a/44465069/702783 Có vẻ ít »hacky« với tôi.
Michael Kühnel

4

Dưới đây là một số cách để làm điều đó:

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

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

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


3

Trong trường hợp của tôi, việc xóa thuộc tính giải quyết vấn đề miễn là có một hàm nhấp được gán cho a.


3

Bạn đã ngăn chặn hành vi trình duyệt mặc định. Nhưng bạn không cần phải tạo một chỉ thị để thực hiện điều đó.

Thật dễ dàng như ví dụ sau:

my.component.html

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

my.component.ts

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

3

Cập nhật cho 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

Tôi có 4 giải pháp cho thẻ neo giả.

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

4. Nếu bạn đang sử dụng bootstrap:

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

0

Tôi tự hỏi tại sao không ai đề xuất routerLink và routerLinkActive (Angular 7)

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

Tôi đã gỡ bỏ href và bây giờ sử dụng cái này. Khi sử dụng href, nó sẽ chuyển đến url cơ sở hoặc tải lại cùng một tuyến đường.


0

bạn cần ngăn chặn hành vi mặc định của sự kiện như sau.

Trong html

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

Trong tập tin ts

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

-1

Cập nhật cho 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();
        }
    }
}

Sử dụng

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

-1

Giải pháp thực sự đơn giản là (click)="(null)"

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


có thể bất kỳ bình luận tại sao kỹ thuật như vậy là xấu?
grigson

1
Viết nhấp ở mọi nơi trong mã khi bạn không muốn nhấp là xấu
Jens Alenius

2
nhưng đây chính xác là những gì tôi muốn làm: đánh dấu vị trí trong mã là "không có gì khi nhấp" có thể, nhưng hỗ trợ cú pháp mới. Các công trình như onclick = "javascript: void" thực sự xấu xí. And href = "#" không đáng tin cậy, vì chúng có thể đưa chế độ xem của bạn lên đầu. Vì vậy, tôi không thể thấy các lựa chọn thay thế tốt hơn
grigson

Tôi thích giải pháp của bạn. Cảm ơn bạn.
Mai Hữu Lợi

Kiểm tra câu trả lời mới của tôi. Nếu bạn không muốn đau nhức điều hướng một nút 'gõ'
Jens Alenius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.