Nie można powiązać z „routerLink”, ponieważ nie jest to znana właściwość

156

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-outletdostę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.jsonjuż stabilną @angular/router 3.3.1wersję. 2- W moim głównym appmodule 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ą Layoutmoduł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.

Umair Sarfraz
źródło
Zaimportuj moduł RouteModule w katalogu głównym aplikacji i zaktualizuj najnowszą stabilną wersję pakietu npm
harshes53
Tak, mam najnowszą stabilną wersję.
Umair Sarfraz
3
Czy dodałeś również RouterModuledo imports: []wszystkich modułów, w których używasz, routerLinkczy<router-outlet>
Günter Zöchbauer
Zamawianie modułów @Umair jest ważne w imporcie, ruszaj AppRoutingModuleprzedLayoutModule
harshes53
1
@ harshes53 Nie sądzę, że to prawda.
Günter Zöchbauer

Odpowiedzi:

289

Musisz dodać RouterModuledo importskażdego, @NgModule()gdzie komponenty używają dowolnego składnika lub dyrektywy z (w tym przypadku routerLinki <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 dodawane declarationstylko do, jest prywatne dla modułu. exportsupublicznia je.

Zobacz też https://angular.io/api/router/RouterModule#usage-notes

Günter Zöchbauer
źródło
@Gunter Czy można wielokrotnie importować RouterModule? Na przykład, jeśli chcę używać routerLink w module childModule, muszę zaimportować RouterModule do modułu podrzędnego, podczas gdy został już zaimportowany przez moduł aplikacji głównej ...
Olivier Boissé
Tak, zostanie uwzględniony tylko raz w wyniku kompilacji.
Günter Zöchbauer
Ok, ale myślę, że musimy uważać, aby wywołać metodę forRoottylko raz, moduły potomne powinny tylko importować RouterModule bez wywoływania metody forRoot
Olivier Boissé
Myślę, że to zależy od tego, co forRootrobi. W przypadku forRootwielokrotnego podawania dostawcom rezultat jest taki sam, jak gdyby było to zrobione tylko raz. Jeśli robisz inne rzeczy, może nie być inaczej.
Günter Zöchbauer
2
Dzięki za tę odpowiedź! W moim przypadku aplikacja działała, ale testy nie powiodły się. Rozwiązaniem było zaimportowanie RouterTestingModule w testach dla każdego komponentu używającego routerLink.
Slavik Shynkarenko
26

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
  ],
Ben Richards
źródło
To nie rozwiązało problemu. Czy możesz sprawdzić moją aktualizację?
Umair Sarfraz
@Ben - „forRoot ()” oznacza, że ​​wywołujesz metodę zdefiniowaną w zaimportowanym module, która uruchamia konfigurację lub instalację modułu. Możesz także zdefiniować metodę taką jak „forChild ()” w module niestandardowym i wywołać ją, jeśli chcesz. Ta metoda jest używana do zadań, takich jak konfigurowanie dostawcy usługi. W ten sposób uzyskujesz usługę Singleton w Angular. Zobacz angular.io/guide/singleton-services
RoboBear
Ustawienie AppRoutingModule jako pierwszego w imporcie rozwiązuje problem
aRyhan
10

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 dodawania routerLinkActive="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 routerLinkActivenie możesz mieć routerLinkActiveOptions.

cchapman
źródło
6

Kiedy nic innego nie działa, gdy powinno działać, zrestartuj ng serv. Przykro jest znaleźć tego rodzaju błędy.

Tudor
źródło
3
Może się zgodzić, jest błąd. Po prostu nadal usuwałem zawartość folderu dist i odbudowywałem. Wreszcie zadziałało. Spróbuj dodać link do każdego komponentu w app.component.ts. Jeśli to nie zadziała, jedyną opcją jest modlitwa i post.
Sam
3

Musisz dodać RouterMoudledo importssekcji modułu zawierającego Headerkomponent

Hung Vu
źródło
1

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

Akitha_MJ
źródło
0

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 specpliku. I w porównaniu do innego podobnego składnika specpliku i okazało się, że brakuje RouterTestingModulew imports, na przykład

    TestBed.configureTestingModule({
      declarations: [
        ...
      ],
      imports: [ReactiveFormsModule, HttpClientTestingModule, RouterTestingModule],
      providers: [...]
    });
  });
thehme
źródło
0

W module bieżącego komponentu zaimportuj RouterModule .

Lubić:-

import {RouterModule} from '@angular/router';
@NgModule({
   declarations:[YourComponents],
   imports:[RouterModule]

...

Pomogło mi.

Shashikant Pandit
źródło