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

Jeff
źródło
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
Prawdopodobnie duplikat łącza routera Angular2 nie działa
isherwood

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.

Sam Redway
źródło
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>
zai
źródło
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/">

raj_just123
źródło
5

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

<a [routerLink]="['/about']">About this</a>
rashfmnb
źródło
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

Losowa osoba
źródło
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

Fernando Del Olmo
źródło
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 .

pozorny
źródło
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 { }
Emerica
źródło
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.

Jiahua Zhang
źródło
1

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

Aragorn
źródło