RouterLink nie działa


117

Mój routing w aplikacjach angular2 działa dobrze. Ale mam zamiar utworzyć na podstawie tego routeLink :

Oto mój routing:

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

A oto linki, które stworzyłem:

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

Spodziewam się, że po ich kliknięciu przechodzi do szanowanego komponentu, ale nic nie wykonują?


Czy możesz spróbować [routerLink]='[/home']? Jakiej wersji Angular2 i wersji routera używasz?
Günter Zöchbauer

to nie działa. czy na pewno z miejscem twoich qutacji ?? Myślę, że używam ostatniej wersji angular2, ale nie wiem, jak to sprawdzić. Wygenerowałem go za pomocą ng new . i powinno zostać zaktualizowane
Jeff

2
Przepraszam, powinno być[routerLink]="['/home']"
Günter Zöchbauer

2
Może zapomniałeś dodać directives: [ROUTER_DIRECTIVES],do metadanych swojego komponentu. Bez tego Angular nie będzie wiedział, jak analizować pliki routerLinks.
Mark Rajcok

Odpowiedzi:


321

Kod, który tam pokazujesz, jest absolutnie poprawny.

Podejrzewam, że problem polega na tym, że nie importujesz RouterModule (czyli tam, gdzie jest zadeklarowany RouterLink) do modułu, który używa tego szablonu.

Miałem podobny problem i zajęło mi to trochę czasu, ponieważ ten krok nie jest wymieniony w dokumentacji.

Przejdź więc do modułu, który deklaruje komponent za pomocą tego szablonu i dodaj:

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

następnie dodaj go do importu modułów np

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

Oprócz poprawnych instrukcji importu będziesz potrzebować również miejsca na pokazanie tego routerLink, które znajduje się w <router-outlet></router-outlet>elemencie, więc również musi być umieszczone gdzieś w znaczniku HTML, aby router wiedział, gdzie wyświetlać te dane.


1
Tak myślałem i tak - w moim przypadku też masz absolutną rację!
Dhananjay

1
Dodanie modułu routera do moich importów załatwiło sprawę, dzięki!
ENDEESA

1
Pracuje dla mnie. Wielkie dzięki!
TheBosti

20

nie zapomnij o tym, aby dodać to poniżej w swoim szablonie:

<router-outlet></router-outlet>

9

Spróbuj zmienić linki, jak poniżej:

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

Dodaj również w nagłówku pliku index.html:

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


5

użyj go w ten sposób, aby uzyskać informacje o mroe przeczytaj ten temat

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

7
Według twojego linku, jego routerLinkpowinien działać ;-)
Günter Zöchbauer

To działa dla "@angular/router": "~3.4.0". Twoje zdrowie!
mikeym

2
Tak, notacja w nawiasach działa (i jest poprawną składnią w określonym celu), ale nie jest to rozwiązanie tego pytania.
isherwood

2

Zdaję sobie sprawę, że to pytanie jest już dość stare i najprawdopodobniej już je naprawiłeś, ale chciałbym opublikować tutaj jako odniesienie dla każdego, kto znajdzie ten post podczas rozwiązywania tego problemu, że tego rodzaju rzecz wygrała nie działa, jeśli tagi kotwicy znajdują się w pliku Index.html. Musi znajdować się w jednym z komponentów


1

Linki są błędne, musisz to zrobić:

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

Możesz przeczytać ten samouczek


1
Notacja w nawiasach służy innemu celowi i nie rozwiązuje tego problemu.
isherwood

to było to! <a [routerLink]="['/home']" routerLinkActive="active"> Home </a> Korzystałem z samouczka, w którym umieściłem routerLinkActive w tagu <li>. kiedy umieściłem go w tagu <a, teraz działa! Wielkie dzięki!!!! to jest wspaniałe!
Rich P

BTW, wszystkie inne tagi / sugerowane elementy są już na miejscu. Teraz ta funkcja działa (w pewnym sensie). Muszę postępować zgodnie z resztą samouczka, ponieważ zauważam, że kiedy wybieram inne wiersze, mimo że wartość dla wybranego wiersza jest przekazywana (widzę to w adresie URL), renderowany jest tylko pierwszy wiersz. Ale to będzie inny temat. Jeszcze raz wielkie dzięki za tę wielką pomoc.
Rich P

Nie wiem dlaczego, ale kiedy umieściłem Bracket, zadziałało i nie zaimportowałem RouterModule w moim module aplikacji ..
Cegone,

1

Użyłem routerlink zamiast routerLink .


Popełniłem ten błąd i to go naprawiło! Nie mam też pojęcia, dlaczego zostałeś zlekceważony (być może dlatego, że zamiast tego mógł to być komentarz lub dlatego, że nie odpowiada bezpośrednio na to konkretne pytanie?). Byłoby miło, gdyby ludzie, którzy go przeciwstawili, mogli podać powód.
JoniVR

1

Dla każdego mającego ten błąd po rozdzieleniu modułów sprawdź swoje trasy, zdarzyło mi się co następuje:

public-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 { }

Przejdź { path: '**', redirectTo: 'home' }do swojego AppRoutingModule:

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

Jest też inny przypadek, który pasuje do tej sytuacji. Jeśli w swoim przechwytywaczu sprawiłeś, że zwraca wartość inną niż logiczna, wynik końcowy jest taki.

Na przykład próbowałem zwrócić obj && obj[key]rzeczy. Po chwili debugowania zdaję sobie sprawę, że muszę ręcznie przekonwertować to na typ boolowski Boolean(obj && obj[key]), aby umożliwić kliknięcie.



1

W przypadku niezbyt ostrych oczu, takich jak moje, hrefzamiast tego routerLinkpotrzebowałem kilku wyszukiwań, aby to zrozumieć #facepalm.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.