Kann nicht an 'routerLink' gebunden werden, da dies keine bekannte Eigenschaft ist

145

Vor kurzem habe ich angefangen, mit Angular 2 zu spielen. Bisher ist es großartig. Also habe ich ein persönliches Demo-Projekt gestartet, um mit zu lernen angular-cli.

Mit der grundlegenden Routing-Einrichtung möchte ich jetzt vom Header zu einigen Routen navigieren. Da mein Header jedoch ein übergeordneter Header ist router-outlet, wird dieser Fehler angezeigt.

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>

Jetzt verstehe ich teilweise, dass, da diese Komponente ein Wrapper router-outletist, auf diese Weise kein Zugriff möglich wäre router. Gibt es für ein solches Szenario die Möglichkeit, von außen auf die Navigation zuzugreifen?

Gerne füge ich bei Bedarf weitere Informationen hinzu. Vielen Dank im Voraus.

Aktualisieren

1- Mein hat package.jsonbereits die stabile @angular/router 3.3.1Version. 2- In meinem appHauptmodul habe ich das importiert routing-module. Siehe unten.

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

Die Route, auf die ich zugreifen möchte, wird von einer anderen delegiert module, nämlich derUsersModule

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

Ich versuche zwar, von einer Komponente aus zu navigieren, die Teil des LayoutModuls ist, aber keine Ahnung vom Routermodul hat. Ist es das, was den Fehler verursacht?

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

Ich versuche von der zu navigieren HeaderComponent. Gerne stelle ich Ihnen bei Bedarf weitere Informationen zur Verfügung.

Umair Sarfraz
quelle
Importieren Sie RouteModule im Stammverzeichnis Ihrer App und aktualisieren Sie die neueste stabile Version des npm-Pakets
harsches 53
Ja, ich habe die neueste stabile Version.
Umair Sarfraz
2
Haben Sie auch das RouterModulezu imports: []allen Modulen hinzugefügt , in denen Sie routerLinkoder<router-outlet>
Günter Zöchbauer
@Umair Modul Bestellung ist wichtig bei Importen, verschieben Sie AppRoutingModulevorLayoutModule
harsches53
1
@ harsches53 Ich glaube nicht, dass das stimmt.
Günter Zöchbauer

Antworten:

256

Sie müssen zu jedem Ort hinzufügen RouterModule, importsan @NgModule()dem Komponenten eine Komponente oder Direktive verwenden (in diesem Fall routerLinkund <router-outlet>.

declarations: [] besteht darin, Komponenten, Anweisungen und Rohre innerhalb des aktuellen Moduls bekannt zu machen.

exports: []besteht darin, Komponenten, Anweisungen und Pipes für den Import von Modulen verfügbar zu machen. Was nur hinzugefügt wird, declarationsist für das Modul privat. exportsmacht sie öffentlich.

Siehe auch https://angular.io/api/router/RouterModule#usage-notes

Günter Zöchbauer
quelle
@Gunter Ist es in Ordnung, RouterModule mehrmals zu importieren? Wenn ich beispielsweise routerLink in einem childModule verwenden möchte, muss ich RouterModule in das untergeordnete Modul importieren, während es bereits vom Root-App-Modul importiert wurde ...
Olivier Boissé
Ja, es wird nur einmal in die Build-Ausgabe aufgenommen.
Günter Zöchbauer
Ok, aber ich denke, wir müssen darauf achten, die Methode forRootnur einmal aufzurufen. Die untergeordneten Module sollten RouterModule nur importieren, ohne die forRoot-Methode aufzurufen
Olivier Boissé,
Ich denke es kommt darauf an was forRootmacht. Wenn Anbieter forRootmehrmals registriert werden , ist das Ergebnis dasselbe, als ob es nur einmal durchgeführt würde. Wenn Sie andere Dinge tun, ist dies möglicherweise nicht anders.
Günter Zöchbauer
2
Danke für diese Antwort! In meinem Fall hat die App funktioniert, aber die Tests sind fehlgeschlagen. Die Lösung bestand darin, RouterTestingModule in Tests für jede Komponente zu importieren, die routerLink verwendet.
Slavik Shynkarenko
24

Sie vermissen entweder die Aufnahme des Routenpakets oder die Aufnahme des Routermoduls in Ihr Haupt-App-Modul.

Stellen Sie sicher, dass Ihre package.json Folgendes enthält:

"@angular/router": "^3.3.1"

Importieren Sie dann in Ihrem app.module den Router und konfigurieren Sie die Routen:

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

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent}
        ])
    ],

Update :

Verschieben Sie das AppRoutingModule so, dass es bei den Importen an erster Stelle steht:

imports: [
    AppRoutingModule.
    BrowserModule,
    FormsModule,
    HttpModule,
    AlertModule.forRoot(), // What is this?
    LayoutModule,
    UsersModule
  ],
Ben Richards
quelle
Dies hat das Problem nicht gelöst. Kannst du bitte mein Update überprüfen?
Umair Sarfraz
@Ben - "forRoot ()" bedeutet, dass Sie eine Methode aufrufen, die für ein importiertes Modul definiert ist und die Konfiguration oder Einrichtung für das Modul ausführt. Sie können auch eine Methode wie "forChild ()" in einem benutzerdefinierten Modul definieren und bei Bedarf aufrufen. Diese Methode wird für Aufgaben wie das Einrichten eines Anbieters für einen Dienst verwendet. So erhalten Sie auch einen Singleton-Service in Angular. Siehe angle.io/guide/singleton-services
RoboBear
10

Ich werde einen weiteren Fall hinzufügen, in dem ich den gleichen Fehler bekam, aber nur ein Dummy war. Ich hatte hinzugefügt, [routerLinkActiveOptions]="{exact: true}"ohne noch hinzuzufügen routerLinkActive="active".

Mein falscher Code war

<a class="nav-link active" routerLink="/dashboard" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

wann es hätte sein sollen

<a class="nav-link active" routerLink="/dashboard" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
  Home
</a>

Ohne zu haben routerLinkActive, können Sie nicht haben routerLinkActiveOptions.

Cchapman
quelle
3

Wenn nichts anderes funktioniert, wenn es funktionieren sollte, starten Sie ng serve neu. Es ist traurig, diese Art von Fehlern zu finden.

Tudor
quelle
2
Kann sich anpassen, gibt es einen Fehler. Ich habe immer wieder den Inhalt des dist-Ordners gelöscht und neu erstellt. Endlich hat es geklappt. Fügen Sie jeder Komponente in app.component.ts einen Link hinzu. Wenn das nicht funktioniert, ist Ihre einzige Option Gebet und Fasten.
Sam
1

In meinem Fall muss ich nur meine neu erstellte Komponente in RouterModule importieren

{path: 'newPath', component: newComponent}

Dann in Ihrem app.moduleImport den Router und konfigurieren Sie die Routen:

{RouterModule} aus '@ angle / router' importieren;

imports: [
        RouterModule.forRoot([
            {path: '', component: DashboardComponent},
            {path: 'dashboard', component: DashboardComponent},
            {path: 'newPath', component: newComponent}
        ])
    ],

Hoffe das hilft jemandem !!!

Akitha_MJ
quelle
1

Sie müssen sich fügen RouterMoudlein importsAbschnitte des Moduls die enthaltenden HeaderKomponente

Hung Vu
quelle