Açısal 2'deki Pasif Bağlantı - <a href=tıkaltma> eşdeğeri


140

Açısal 1.x temelde hiçbir şey yapmayan bir bağlantı oluşturmak için aşağıdakileri yapabilirsiniz:

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

Ancak aynı etiket, Açısal 2'deki uygulama tabanına gider. Açısal 2'deki eşdeğer nedir?

Edit: Angular 2 Router bir hata gibi görünüyor ve şimdi github bu konuda açık bir sorun var.

Kutudan çıkmış bir çözüm veya herhangi bir olmayacağına dair bir onay arıyorum.


Hala yapabilirsin. Sadece html. Bunun için özel bir kullanımı var mı?
Sasxa

Evet, hala geçerli html, ancak etki Açısal 1.x ile aynı değildir.
s.alem

1
<a>"Html" olmadan denedin mi?
Sasxa

3
Evet, ama tarayıcıdan aynı şekilde davranmıyor. Css ile imleç efekti geçersiz kılabilir ve tüm aetiketleri işaretçi atayabiliyorum biliyorum . Ama bu acayip görünüyor.
s.alem

3
Benim görüşüm ng1 yolu yanlış yolu (: Varsayılan davranış standart html olduğu gibi olmalıdır ...
Sasxa

Yanıtlar:


187

Eğer varsa Açısal 5 veya üzeri, sadece değişimi

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

içine

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

Fareyle üzerine gelindiğinde bir bağlantı el simgesi ile gösterilir ve tıklandığında rota tetiklenmez.

Not: Sorgu parametrelerini korumak istiyorsanız, queryParamsHandlingseçeneği şu şekilde ayarlamanız gerekir preserve:

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

2
Bu , Chrome 64'te Açısal 5 [routerLink]=""olarak oluşturduğu çalıştı.<a href="null" (click)="myFunction()">My Link</a>
Zymotik

3
Aynı şeyi onaylayabilirim [routerLink]=""/ href="null"IE 11'de çalışıyor
Zymotik

1
<a [routerLink Cialis="" (click)="passTheSalt()"> Beni tıkla </a> açısal7'de çalışır. Ben yönlendirici olmadan <aLclcl)="passTheSalt()"> Beni tıkla </a> görüyorumLInk de açısal7'de çalışıyor. [routerLink] kullanarak veya routerLink kullanmadan pasif bir bağlantı oluşturmanın daha iyi bir yolu nedir?
Ian Poston Framer

1
@IanPostonFramer Kaldırdığımda [routerLink]="", Beni tıkla metni bir bağlantı olarak görüntülenmiyor ve el imleci simgesini göstermiyor.
Emiel Koning

5
DİKKAT: bu URL parametrelerinizi sıfırlar. alıcı sakının.
Stavm

88

Bu aynı olacak, hiçbir ilgisi yok angular2. Basit html etiketidir.

Temel olarak a(çapa) etiketi HTML ayrıştırıcısı tarafından oluşturulur.

Düzenle

Buna hrefsahip javascript:void(0)olarak devre dışı bırakabilirsiniz, böylece üzerinde hiçbir şey olmaz. (Ama hack). Angular 1'in şu anda benim için doğru görünmeyen bu işlevselliği sağladığını biliyorum.

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

Plunkr


Etrafında başka bir yol kullanmak olabilir , sonuçta boş üretecek routerLinkgeçiş ""değeri ile direktifhref=""

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

@ s.alem ne diyorsun, #iç çapa sahip olmanın rotayı hrefetkileyebileceğini Angular1.. seni varsayılan sayfaya gönderebilir (eğer varsa)
Pankaj Parkar

1
#Açısal 1.x'in etkisini biliyorum . Açısal2'de hiçbir şey yapmayan bir bağlantı istiyorum, tıpkı href=""açısal 1.x'te olduğu gibi .
s.alem

@ s.alem so <a href="">My Link</a> yapacak ... ama şu anda onunla ne oluyor?
Pankaj Parkar

1
[routerLink] = "", sorgu parametrelerini rotanızdan kaldıracak, bu muhtemelen istediğiniz şey değil. Koruma sorgusu parametrelerini kullanabilirsiniz, ancak bu çok ileri gidiyor gibi görünüyor
Koruma

2
Ancak, seçenek 1: href="javascript:void(0);"Benim için çalışıyor mu.
Paul Carlton

21

Açısal2 ile yapmanın yolları vardır, ancak bunun bir hata olduğuna kesinlikle katılmıyorum. Açısal1'e aşina değilim, ancak bazı durumlarda yararlı olduğunu iddia ettiğiniz halde bu gerçekten yanlış bir davranış gibi görünüyor, ancak açıkça bu herhangi bir çerçevenin varsayılan davranışı olmamalıdır.

Anlaşmazlıkları bir kenara bırakarak, tüm bağlantılarınızı alan basit bir yönerge yazabilir ve hrefiçeriğini kontrol edebilirsiniz preventDefault().

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

PLATFORM_DIRECTIVES içine bu yönergeyi ekleyerek başvurunuz genelinde çalışmasını sağlayabilirsiniz

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

İşte bir bir örnek çalışan plnkr .


Küresel, açısal bir çözüm için oy verin, ancak doğru cevap olarak kabul etmiyorum çünkü dediğim gibi, sadece bir kutu çözümü arıyorum, olmayacağını onaylayana kadar veya gerçekten ihtiyacım olana kadar o. Ama yine de çok teşekkür ederim.
s.alem

2
Sorun pointer-eventsIE ( caniuse ) ile destek eksikliğidir ( IE11 ile bile garip bir şekilde atlayabilirim) ve konsoldan bağlantıya tıklamayı engellemez . @Pankaj cevabını iptal ettim, çünkü benim açımdan en kolay olanı, cevabım bunu açısal2 ile yapmanın bir yolu, daha kolay yapabilirim ama css seçicileri sınırlı.
Eric Martinez

1
Bu, bootstrap sekme bağlantılarını (<a href="#tab-id"> gibi)
bozuyor

Bootstrap işlevi hangi modülde?
Jun711

16

Bir achor bir şeye gitmelidir, bu yüzden yönlendirdiğinde davranışın doğru olduğunu düşünüyorum. Sayfadaki bir şeyi değiştirmek için daha fazla bir düğme gibi mi? Bunu kullanabilmek için bootstrap kullanıyorum:

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

1
Bu çözümü seviyorum. İmlecin bir el göstermesini istiyorsanız, style = "cursor: pointer" ekleyin.
newman

Ancak çoğu durumda iyi bir çözüm, düğmenin yalnızca metin tabanlı bağlantıdan daha büyük boyutlara sahip olduğunu unutmayın.
yankee

@yankee bunu css ile değiştirebilirsiniz, ama ben tavsiye etmiyorum ... aslında, bir düğme bir düğme ve bir bağlantı bir bağlantı ... çok üzücü web o beyaz veya siyah değil.
Ayyash

11

Bu geçici çözümü css ile kullanıyorum:

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

Bu yardımcı olur umarım


1
Temelde eksik olan görsel bir efekt olduğu için bu daha iyi bir çözümdür. Bu CSS'yi Angular projesinin en üst düzey styles.cssdosyasına koyabilirsiniz ve harika çalışır!


5

Gerçekten basit bir çözüm bir A etiketi kullanmak değildir - bunun yerine bir span kullanın:

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

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

Bunu sematik işaretleme anlamında yapmamalısınız. buttonSayfada yapmak istemeniz durumunda bir Öğe kullanın doSomething.
Michael Kühnel

<button>spacetuşa basıldığında öğeler varsayılan olarak tıklamayı tetikler . Bu özelliği span(veya <a>) kullanmak kaldırır - böylece klavye eylemleri beklendiği gibi çalışmaz
Drenai

4

İşte basit bir yol

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

köpüren olayı yakala ve vur


Neden çapanın kendisini varsayılan davranışı önlemek için kullanmıyorsunuz? Burada açıklandığı gibi : stackoverflow.com/a/44465069/702783 Bana daha az »hacky« gibi görünüyor.
Michael Kühnel

4

İşte bunu yapmanın bazı yolları:

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

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

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


3

Benim durumumda bir a tıklama fonksiyonu olduğu sürece href özniteliğini silmek sorunu çözmek.


3

Varsayılan tarayıcı davranışını engellediniz. Ancak bunu başarmak için bir yönerge oluşturmanız gerekmez.

Aşağıdaki örnek gibi kolaydır:

my.component.html

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

my.component.ts

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

3

Açısal 5 için güncellendi

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

Sahte bağlantı etiketi için 4 çözümüm var.

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

4. Bootstrap kullanıyorsanız:

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

0

Neden kimsenin yönlendirici önermediğini merak ediyorumLink ve yönlendiriciLinkActive (Açısal 7)

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

Href'i kaldırdım ve şimdi bunu kullanıyorum. Href kullanırken, temel URL'ye gidiyordu veya aynı rotayı tekrar yüklüyordu.


0

etkinliğin varsayılan davranışını aşağıdaki gibi önlemeniz gerekir.

Html içinde

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

Ts dosyasında

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

-1

Angular2 RC4 için güncellendi:

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

kullanma

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

-1

Gerçekten basit bir çözüm (click)="(null)"

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


belki böyle bir teknisyen neden kötü yorum?
grigson

1
Tıklama istemediğinizde kodun her yerine tıklamak kötü
Jens Alenius

2
ama bu tam olarak yapmak istediğim şey: kod yeri "hiçbir tıklama-on" mümkün olarak işaretlemek, ancak yeni sözdizimi destekleyin. Onclick = "javascript: void" gibi yapılar gerçekten çirkin. Ve href = "#" güvenilir değildir, çünkü görünümünüzü en üste taşıyabilirler. Yani daha iyi alternatifleri göremiyorum
grigson

Çözümünü beğendim. Teşekkür ederim.
Mai Hữu Lợi

Yeni cevabımı kontrol et. Achor gezinmek istemiyorsanız, onun bir düğme 'türü'
Jens Alenius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.