RouterLink non funziona


117

Il mio percorso nelle app angular2 funziona bene. Ma ho intenzione di creare un routeLink basato su questo :

Ecco il mio percorso:

const routes: RouterConfig = [
    { path:'home' , component: FormComponent  },
    { path:'about', component: AboutComponent },
    { path:'**'   , component: FormComponent  }
];

Ed ecco i link che ho creato:

<ul class="nav navbar-nav item">
                    <li>
                        <a routerLink='/home' routerLinkActive="active">Home</a>
                    </li>
                    <li>
                        <a routerLink='/about' routerLinkActive="active">About this</a>
                    </li>
</ul>

Mi aspetto che, quando clicco su di essi, navighi al componente rispettato, ma non eseguono nulla?


Puoi provare per favore [routerLink]='[/home']? Quale versione di Angular2 e quale versione del router stai utilizzando?
Günter Zöchbauer

non funziona. sei sicuro del luogo delle tue domande? Penso di utilizzare l'ultima versione di angular2, ma non so come controllarla. L'ho generato con ng new . e dovrebbe essere aggiornato
Jeff

2
Mi dispiace, dovrebbe essere[routerLink]="['/home']"
Günter Zöchbauer

2
Forse ti sei dimenticato di aggiungere directives: [ROUTER_DIRECTIVES],ai metadati del tuo componente. Senza questo, Angular non saprà analizzare i file routerLinks.
Mark Rajcok

Risposte:


321

Il codice che stai mostrando è assolutamente corretto.

Sospetto che il tuo problema sia che non stai importando RouterModule (che è dove viene dichiarato RouterLink) nel modulo che utilizza questo modello.

Ho avuto un problema simile e mi ci è voluto del tempo per risolverlo poiché questo passaggio non è menzionato nella documentazione.

Quindi vai al modulo che dichiara il componente con questo modello e aggiungi:

import { RouterModule } from '@angular/router';

quindi aggiungilo ai tuoi moduli importa ad es

@NgModule({
  imports: [
    CommonModule,
    RouterModule
  ],
  declarations: [MyTemplatesComponent]
})
export class MyTemplatesModule { }

Oltre ad avere le istruzioni di importazione corrette, avrai anche bisogno di un posto per mostrare quel routerLink, che si trova <router-outlet></router-outlet>nell'elemento, in modo che anche questo debba essere posizionato da qualche parte nel tuo markup HTML in modo che il router sappia dove visualizzare quei dati.


1
Lo pensavo e sì, anche nel mio caso hai assolutamente ragione!
Dhananjay

1
L'aggiunta del modulo Router alle mie importazioni ha funzionato, grazie!
ENDEESA

1
Per me va bene. Molte grazie!
TheBosti

20

non dimenticarlo per aggiungerlo di seguito nel tuo modello:

<router-outlet></router-outlet>

9

Prova a cambiare i link come di seguito:

  <ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this</a>
    </li>
  </ul>

Inoltre, aggiungi quanto segue nell'intestazione di index.html:

<base href="https://stackoverflow.com/">


5

usalo in questo modo per maggiori informazioni leggi questo argomento

<a [routerLink]="['/about']">About this</a>

7
Secondo il tuo link, il suo routerLinkdovrebbe funzionare ;-)
Günter Zöchbauer

Questo funziona per "@angular/router": "~3.4.0". Saluti!
mikeym

2
Sì, la notazione delle parentesi funziona (ed è una sintassi valida con uno scopo specifico), ma non è una soluzione a questa domanda.
Isherwood

2

Sono consapevole che questa domanda è abbastanza vecchia ormai, e molto probabilmente l'hai già risolta, ma mi piacerebbe postare qui come riferimento per chiunque trovi questo post durante la risoluzione di questo problema è che questo genere di cose ha vinto non funziona se i tuoi tag Anchor sono in Index.html. Deve essere in uno dei componenti


1

I collegamenti sono sbagliati, devi fare questo:

<ul class="nav navbar-nav item">
    <li>
        <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
    </li>
    <li>
        <a [routerLink]="['/about']" routerLinkActive="active">About this
        </a>
    </li>
</ul>

Puoi leggere questo tutorial


1
La notazione tra parentesi ha uno scopo diverso e non risolve questo problema.
Isherwood

era questo! <a [routerLink”="['/home'”" routerLinkActive="active"> Home </a> Stavo seguendo il tutorial che mi ha fatto inserire routerLinkActive nel tag <li>. quando l'ho inserito nel tag <a ora funziona! Grazie molto!!!! questo è eccellente!
Rich P

A proposito, ho già tutti gli altri tag / elementi suggeriti. Ora questa funzione funziona (più o meno). Devo seguire il resto del tutorial perché noto che quando seleziono altre righe, anche se il valore per la riga selezionata viene passato (lo vedo nell'URL) viene renderizzata solo la prima riga. Ma questo sarà un altro argomento. Molte grazie ancora per questo grande aiuto.
Rich P

Non so perché, ma quando ho messo Bracket, ha funzionato per me e non ho importato RouterModule nel modulo della mia app ..
Cegone

1

Stavo usando routerlink invece di routerLink .


Ho fatto questo errore e questo lo ha risolto! Inoltre non ho idea del motivo per cui sei stato downvotato (forse perché questo avrebbe potuto essere un commento invece o perché non risponde direttamente a questa domanda specifica?). Sarebbe bello se le persone che lo votano negativamente potessero fornire una ragione.
JoniVR

1

Per chiunque abbia questo errore dopo aver diviso i moduli, controlla i tuoi percorsi, mi è successo quanto segue:

pubblico-routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: '**', redirectTo: 'home' } // ← This was my mistake
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-routing.module.ts:

const routes: Routes = [
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

Passa { path: '**', redirectTo: 'home' }al tuo AppRoutingModule:

pubblico-routing.module.ts:

const routes: Routes = [
    { path: '', component: HomeComponent },
    { path: 'home', component: HomeComponent },
    { path: 'privacy-policy', component: PrivacyPolicyComponent },
    { path: 'credits', component: CreditsComponent },
    { path: 'contact', component: ContactComponent },
    { path: 'news', component: NewsComponent },
    { path: 'presentation', component: PresentationComponent }
]

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class PublicRoutingModule { }

app-routing.module.ts:

const routes: Routes = [
    { path: '**', redirectTo: 'home' }
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

1

C'è anche un altro caso che si adatta a questa situazione. Se nel tuo intercettore, hai fatto in modo che restituisse un valore non booleano, il risultato finale è così.

Ad esempio, avevo provato a restituire obj && obj[key]qualcosa. Dopo aver eseguito il debug per un po ', mi rendo conto che devo convertirlo manualmente in tipo booleano Boolean(obj && obj[key])per far passare il clic.



1

Per gli occhi non molto acuti come i miei, hrefinvece routerLink, ho fatto qualche ricerca per capirlo #facepalm.

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.