Collegamento passivo in Angolare 2 - <a href=annuncio annunciato> equivalente


140

In Angular 1.x posso fare quanto segue per creare un collegamento che sostanzialmente non fa nulla:

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

Ma lo stesso tag passa alla base dell'app in Angular 2. Qual è l'equivalente di quello in Angular 2?

Modifica: sembra un bug nel router Angular 2 e ora c'è un problema aperto su github a riguardo.

Sto cercando una soluzione pronta all'uso o una conferma che non ce ne sarà.


Puoi ancora. È solo HTML. Qualche uso particolare per questo?
Sasxa,

Sì, è ancora valido HTML, ma l'effetto non è lo stesso con Angular 1.x.
sabato

1
Hai provato solo <a>, senza "html"?
Sasxa,

3
Sì, ma il browser non lo tratta allo stesso modo. So che posso sovrascrivere, ad esempio, l'effetto cursore con css e assegnare il puntatore a tutti i atag. Ma sembra disordinato.
sabato

3
La mia opinione è che ng1 era nel modo sbagliato (: il comportamento predefinito dovrebbe essere come in html standard ...
Sasxa,

Risposte:


187

Se hai Angular 5 o superiore, cambia

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

in

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

Verrà visualizzato un collegamento con un'icona a forma di mano quando ci si passa sopra e si fa clic su di esso non attiverà alcun percorso.

Nota: se si desidera mantenere i parametri della query, è necessario impostare l' queryParamsHandlingopzione su preserve:

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

2
Questo ha funzionato [routerLink]=""come <a href="null" (click)="myFunction()">My Link</a>Angular 5 in Chrome 64.
Zymotik

3
Posso confermare lo stesso [routerLink]=""/ href="null"sta funzionando in IE 11
Zymotik il

1
<a [routerLink lasting="" (click)="passTheSalt()"> Click me </a> funziona in angular7. Vedo <a (click)="passTheSalt()"> Cliccami </a> senza routerLInk funziona anche in angular7. qual è il modo migliore per creare un collegamento di ancoraggio passivo utilizzando [routerLink] o nessun routerLink?
Ian Poston Framer

1
@IanPostonFramer Quando rimuovo [routerLink]="", il testo Fare clic su di me non viene visualizzato come collegamento e non mostra l'icona del cursore a mano.
Emiel Koning

5
AVVISO: questo ripristinerà i parametri URL. compratore stai attento.
Stavm,

88

Sarà lo stesso, non ha nulla a che fare con angular2. È un semplice tag HTML.

Fondamentalmente il atag (anchor) verrà reso dal parser HTML.

modificare

Puoi disabilitarlo hrefavendo javascript:void(0)su di esso in modo che non accadrà nulla su di esso. (Ma il suo hack). So che Angular 1 ha fornito questa funzionalità pronta all'uso che non mi sembra corretta ora.

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

Plunkr


In alternativa si potrebbe usare una routerLinkdirettiva con ""valore di passaggio che alla fine genererà spaziohref=""

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

@s.alem qualunque cosa tu stia dicendo, che avere l' #ancoraggio interno hrefpuò influire sul Angular1percorso..può inviarti alla pagina predefinita (se è lì)
Pankaj Parkar

1
Conosco l'effetto di #1.x angolare Voglio un link che non faccia nulla in angular2, proprio come href=""in 1.x angolare
sabato

@s.alem quindi <a href="">My Link</a>lo farà..ma cosa sta succedendo attualmente con esso?
Pankaj Parkar,

1
[routerLink] = "" rimuoverà i parametri di query dal tuo percorso, probabilmente non è quello che desideri. È possibile utilizzare preservare i parametri della query, ma questo sembra andare troppo lontano
narthur157,

2
Tuttavia, l'opzione 1: href="javascript:void(0);"FUNZIONA per me.
Paul Carlton,

21

Ci sono modi per farlo con angular2, ma non sono assolutamente d'accordo che si tratti di un bug. Non ho familiarità con angular1, ma questo sembra un comportamento davvero sbagliato anche se come affermi sia utile in alcuni casi, ma chiaramente questo non dovrebbe essere il comportamento predefinito di qualsiasi framework.

A parte i disaccordi puoi scrivere una semplice direttiva che prende tutti i tuoi collegamenti e controlla hrefil contenuto e se la lunghezza è 0 che esegui preventDefault(), ecco un piccolo esempio.

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

Puoi farlo funzionare su tutta l'applicazione aggiungendo questa direttiva in PLATFORM_DIRECTIVES

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

Ecco un plnkr con un esempio funzionante.


Sostenere una soluzione globale e angolare, ma non la accetto come la risposta corretta perché, come ho detto, sto solo cercando una soluzione out-box, fino a quando non confermano che non ce ne sarà alcuna o fino a quando non ne ho davvero bisogno esso. Ma ancora grazie mille.
sabato

2
Il problema pointer-eventsè la mancanza di supporto con IE ( caniuse ) (posso bypassarlo anche con IE11 abbastanza stranamente), e non impedisce di fare clic sul collegamento dalla console. Ho votato la risposta di @Pankaj perché è la più semplice dal mio punto di vista, la mia risposta è solo un modo di farlo con angular2, potrei renderlo più semplice ma i selettori CSS sono limitati.
Eric Martinez,

1
Questo sembra interrompere i collegamenti alle schede bootstrap (come <a href="#tab-id">)
xd6_

In quale modulo si trova la funzione bootstrap?
Jun711,

16

Un achor dovrebbe navigare verso qualcosa, quindi immagino che il comportamento sia corretto quando instrada. Se ne hai bisogno per attivare o disattivare qualcosa sulla pagina è più simile a un pulsante? Uso bootstrap così posso usare questo:

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

1
Mi piace questa soluzione. Se vuoi che il cursore mostri una mano, aggiungi style = "pointer: pointer".
Newman,

In molte situazioni una buona soluzione, tuttavia, tenere presente che il pulsante ha dimensioni maggiori rispetto al semplice ancoraggio basato su testo.
Yankee

@yankee puoi cambiarlo in css, ma non lo consiglio ... in realtà, un pulsante è un pulsante e un link è un link ... troppo triste il web non è così bianco o nero.
Ayyash,

11

Sto usando questa soluzione alternativa con 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>

Spero che questo ti aiuti


1
Questa è una soluzione migliore in quanto manca principalmente un effetto visivo. Puoi inserire questo CSS nel styles.cssfile di livello superiore del progetto Angular e funzionerà alla grande!


5

Una soluzione davvero semplice non è quella di utilizzare un tag A: utilizzare invece un intervallo:

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

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

Non dovresti farlo nel senso del markup sematico. Usa un buttonelemento nel caso lo desideri doSomethingsulla pagina.
Michael Kühnel,

<button>gli elementi attivano il clic per impostazione predefinita quando spaceviene premuto il tasto. L'uso span(o <a>) rimuove questa funzione - quindi le azioni della tastiera non funzioneranno come previsto
Drenai,

4

Ecco un modo semplice

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

cattura l'evento gorgogliante e abbattilo


Perché non utilizzare l'ancora stesso per prevenire il comportamento predefinito? Come descritto qui: stackoverflow.com/a/44465069/702783 Mi sembra meno »hacky« per me.
Michael Kühnel,

4

Ecco alcuni modi per farlo:

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

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

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


3

Nel mio caso, l'eliminazione dell'attributo href risolve il problema finché esiste una funzione clic assegnata a.


3

Hai impedito il comportamento predefinito del browser. Ma non è necessario creare una direttiva per raggiungere questo obiettivo.

È facile come il seguente esempio:

my.component.html

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

my.component.ts

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

3

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

Ho 4 soluzioni per il tag di ancoraggio fittizio.

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

4. Se si utilizza bootstrap:

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

0

Mi chiedo perché nessuno stia suggerendo routerLink e routerLinkActive (Angular 7)

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

Ho rimosso l'HREF e ora sto usando questo. Quando si utilizza href, si andava all'URL di base o si ricaricava di nuovo lo stesso percorso.


0

è necessario impedire il comportamento predefinito dell'evento come segue.

In html

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

Nel file ts

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

-1

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

utilizzando

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

-1

La soluzione davvero semplice è (click)="(null)"

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


forse qualche commento sul perché tale tecnica è negativa?
Grigson,

1
Scrivere clic ovunque nel codice quando non si desidera un clic è negativo
Jens Alenius,

2
ma questo è esattamente quello che voglio fare: contrassegnare il posto nel codice come "nulla-su-clic", ma supportare la nuova sintassi. Le costruzioni come onclick = "javascript: void" sono davvero brutte. E href = "#" non sono affidabili, poiché possono saltare in alto la finestra. Quindi non vedo alternative migliori
Grigson

Mi piace la tua soluzione. Grazie.
Mai Hữu Lợi,

Controlla la mia nuova risposta. Se non vuoi che l'anchor navighi è un 'tipo' pulsante
Jens Alenius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.