Niedawno zacząłem bawić się angularem 2. Jak dotąd jest niesamowity. Zacząłem więc osobisty projekt demonstracyjny, aby nauczyć się obsługi angular-cli
.
Przy podstawowej konfiguracji routingu chcę teraz przejść do niektórych tras z nagłówka, ale ponieważ mój nagłówek jest elementem nadrzędnym dla router-outlet
, pojawia się ten błąd.
app.component.html
<app-header></app-header> // Trying to navigate from this component
<router-outlet></router-outlet>
<app-footer></app-footer>
header.component.html
<a [routerLink]="['/signin']">Sign in</a>
Teraz rozumiem częściowo, myślę, że skoro ten komponent jest otoką, router-outlet
dostęp w ten sposób nie byłby możliwy router
. Czy jest więc możliwość dostępu do nawigacji z zewnątrz w takim scenariuszu?
W razie potrzeby z przyjemnością dodam więcej informacji. Z góry dziękuję.
Aktualizacja
1- Mam package.json
już stabilną @angular/router 3.3.1
wersję. 2- W moim głównym app
module zaimportowałem plik routing-module
. Patrz poniżej.
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AlertModule } from 'ng2-bootstrap';
import { LayoutModule } from './layout/layout.module';
import { UsersModule } from './users/users.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
@NgModule({
declarations: [
AppComponent,
PageNotFoundComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
AlertModule.forRoot(),
LayoutModule,
UsersModule,
AppRoutingModule --> This is the routing module.
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SigninComponent } from './users/signin/signin.component';
import { PageNotFoundComponent } from './shared/components/not-found.component';
const routes: Routes = [
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
Trasa, do której próbuję uzyskać dostęp, jest delegowana z innego module
, czyliUsersModule
user-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SigninComponent } from './signin/signin.component';
const usersRoutes: Routes = [
{ path: 'signin', component: SigninComponent }
];
@NgModule({
imports: [
RouterModule.forChild(usersRoutes)
],
exports: [
RouterModule
]
})
export class UsersRoutingModule { }
Podczas gdy próbuję nawigować z komponentu, który jest częścią Layout
modułu, ale nie ma pojęcia o module routera. Czy to jest przyczyną błędu.
Layout.module.ts
import { NgModule } from '@angular/core';
import { HeaderComponent } from './header/header.component';
import { FooterComponent } from './footer/footer.component';
@NgModule({
declarations: [HeaderComponent, FooterComponent],
exports: [HeaderComponent, FooterComponent]
})
export class LayoutModule{}
Próbuję nawigować z HeaderComponent
. W razie potrzeby chętnie udzielę dodatkowych informacji.
źródło
RouterModule
doimports: []
wszystkich modułów, w których używasz,routerLink
czy<router-outlet>
AppRoutingModule
przedLayoutModule
Odpowiedzi:
Musisz dodać
RouterModule
doimports
każdego,@NgModule()
gdzie komponenty używają dowolnego składnika lub dyrektywy z (w tym przypadkurouterLink
i<router-outlet>
.declarations: []
polega na tworzeniu komponentów, dyrektyw, potoków znanych wewnątrz bieżącego modułu.exports: []
polega na udostępnieniu komponentów, dyrektyw, rur do importu modułów. To, co jest dodawanedeclarations
tylko do, jest prywatne dla modułu.exports
upublicznia je.Zobacz też https://angular.io/api/router/RouterModule#usage-notes
źródło
forRoot
tylko raz, moduły potomne powinny tylko importować RouterModule bez wywoływania metody forRootforRoot
robi. W przypadkuforRoot
wielokrotnego podawania dostawcom rezultat jest taki sam, jak gdyby było to zrobione tylko raz. Jeśli robisz inne rzeczy, może nie być inaczej.Brakuje uwzględnienia pakietu tras lub modułu routera w głównym module aplikacji.
Upewnij się, że plik package.json ma to:
"@angular/router": "^3.3.1"
Następnie w module app.module zaimportuj router i skonfiguruj trasy:
import { RouterModule } from '@angular/router'; imports: [ RouterModule.forRoot([ {path: '', component: DashboardComponent}, {path: 'dashboard', component: DashboardComponent} ]) ],
Aktualizacja :
Przenieś AppRoutingModule na pierwsze miejsce w imporcie:
imports: [ AppRoutingModule. BrowserModule, FormsModule, HttpModule, AlertModule.forRoot(), // What is this? LayoutModule, UsersModule ],
źródło
Dodam kolejny przypadek, w którym otrzymywałem ten sam błąd, ale po prostu byłem atrapą. Dodałem
[routerLinkActiveOptions]="{exact: true}"
bez jeszcze dodawaniarouterLinkActive="active"
.Mój nieprawidłowy kod to
<a class="nav-link active" routerLink="/dashboard" [routerLinkActiveOptions]="{exact: true}"> Home </a>
kiedy powinno
<a class="nav-link active" routerLink="/dashboard" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}"> Home </a>
Bez posiadania
routerLinkActive
nie możesz miećrouterLinkActiveOptions
.źródło
Kiedy nic innego nie działa, gdy powinno działać, zrestartuj ng serv. Przykro jest znaleźć tego rodzaju błędy.
źródło
Musisz dodać
RouterMoudle
doimports
sekcji modułu zawierającegoHeader
komponentźródło
W moim przypadku wystarczy zaimportować nowo utworzony komponent do RouterModule
{path: 'newPath', component: newComponent}
Następnie w twoim
app.module
zaimportuj router i skonfiguruj trasy:importuj {RouterModule} z '@ angular / router';
imports: [ RouterModule.forRoot([ {path: '', component: DashboardComponent}, {path: 'dashboard', component: DashboardComponent}, {path: 'newPath', component: newComponent} ]) ],
Mam nadzieję, że to komuś pomoże !!!
źródło
Przeprowadzam testy mojej aplikacji Angular i również napotkałem błąd
Can't bind to 'routerLink' since it isn't a known property of 'a'
.Pomyślałem, że przydatne może być pokazanie moich zależności Angular:
"@angular/animations": "^8.2.14", "@angular/common": "^8.2.14", "@angular/compiler": "^8.2.14", "@angular/core": "^8.2.14", "@angular/forms": "^8.2.14", "@angular/router": "^8.2.14",
Problem był w moim
spec
pliku. I w porównaniu do innego podobnego składnikaspec
pliku i okazało się, że brakujeRouterTestingModule
wimports
, na przykładTestBed.configureTestingModule({ declarations: [ ... ], imports: [ReactiveFormsModule, HttpClientTestingModule, RouterTestingModule], providers: [...] }); });
źródło
W module bieżącego komponentu zaimportuj RouterModule .
Lubić:-
import {RouterModule} from '@angular/router'; @NgModule({ declarations:[YourComponents], imports:[RouterModule]
...
Pomogło mi.
źródło