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.


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


@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
  ],

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.


6

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


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


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


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: [...]
    });
  });

0

W module bieżącego komponentu zaimportuj RouterModule .

Lubić:-

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

...

Pomogło mi.

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.