„gniazdo routera” nie jest znanym elementem

103

Mam projekt MVC 5 z kątową nakładką. Chciałem dodać routing zgodnie z opisem w tym samouczku https://angular.io/guide/router . Więc w moim _Layout.cshtmldodałem

<base href="/">

i utworzyłem mój routing w moim module app.module. Ale kiedy to uruchamiam, pojawia się następujący błąd:

Error: Template parse errors:
    'router-outlet' is not a known element:
    1. If 'router-outlet' is an Angular component, then verify that it is part       of this module.
    2. If 'router-outlet' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA'   to the '@NgModule.schemas' of this component to suppress this message. ("
    <a routerLink="/dashboard">dashboard</a>
    </nav>
    [ERROR ->]<router-outlet></router-outlet>
     "): ng:///AppModule/AppComponent.html@5:0

W moim komponencie app.component linia

<router-outlet></router-outlet>

wyświetla błąd informujący mnie, że program Visual studio nie może rozpoznać tagu „router-outlet”. Jakieś sugestie, jak mogę naprawić ten błąd? Czy brakuje mi referencji lub importu lub po prostu coś przeoczę?

Poniżej znajdują się moje package.json, app.component i app.module

package.json:

{
    "version": "1.0.0",
    "name": "app",
    "private": true,
    "scripts": {},
    "dependencies": {
    "@angular/common": "^4.2.2",
    "@angular/compiler": "^4.2.2",
    "@angular/core": "^4.2.2",
    "@angular/forms": "^4.2.2",
    "@angular/http": "^4.2.2",
    "@angular/platform-browser": "^4.2.2",
    "@angular/platform-browser-dynamic": "^4.2.2",
    "@angular/router": "^4.2.2",
    "@types/core-js": "^0.9.41",
    "angular-in-memory-web-api": "^0.3.2",
    "bootstrap": "^3.3.7",
    "core-js": "^2.4.1",
    "graceful-fs": "^4.0.0",
    "ie-shim": "^0.1.0",
    "minimatch": "^3.0.4",
    "reflect-metadata": "^0.1.10",
    "rxjs": "^5.0.1",
    "systemjs": "^0.20.12",
    "zone.js": "^0.8.12"
    },
    "devDependencies": {
    "gulp": "^3.9.1",
    "gulp-clean": "^0.3.2",
    "gulp-concat": "^2.6.1",
    "gulp-tsc": "^1.3.2",
    "gulp-typescript": "^3.1.7",
    "path": "^0.12.7",
    "typescript": "^2.3.3"
    }
}

app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { RouterModule, Routes } from '@angular/router';

import { AppComponent } from './app.component';
import {DashboardComponent} from "./dashboard/dashboard.component"    

const appRoutes: Routes = [
{
    path: '',
    redirectTo: '/dashboard',
    pathMatch: 'full',
    component: DashboardComponent
},  
{
    path: 'dashboard',
    component: DashboardComponent
}
];
@NgModule({
imports: [
    RouterModule.forRoot(appRoutes),
    BrowserModule,
    FormsModule               
],
exports: [RouterModule],
declarations: [
    AppComponent,  
    DashboardComponent      
],
bootstrap: [AppComponent]
})
export class AppModule {

}

app.component.ts:

import { Component } from '@angular/core';

@Component({
selector: 'my-app',
template: `
          <h1>{{title}}</h1>
          <nav>
          <a routerLink="/dashboard">dashboard</a>
          </nav>
          <router-outlet></router-outlet>
          `
})
export class AppComponent {
    title = 'app Loaded';

}
Molo
źródło

Odpowiedzi:

71

Spróbuj z:

@NgModule({
  imports: [
      BrowserModule,
      RouterModule.forRoot(appRoutes),
      FormsModule               
  ],
  declarations: [
      AppComponent,  
      DashboardComponent      
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Nie ma potrzeby konfigurowania eksportu w programie AppModule, ponieważ AppModuleinne moduły w Twojej aplikacji nie będą importowane.

Jota.Toledo
źródło
1
Nie rozumiem, co masz na myśli
Jota.Toledo,
@ Jota.Toledo Stworzyłem osobny plik Module do routingu, w którym zdefiniowałem trasy. Mam również BrowserModule, FormsModule w importach app.module i wszystkie trzy w pliku routing-module. Ale nadal otrzymuję ten błąd. Jakaś rada?
ninja_md
1
@ninja_md Czy dodałeś deklarację eksportu do pliku modułu routingu? Jak poniżej. @NgModule({ imports: [ RouterModule.forRoot(appRoutes) ], exports: [ RouterModule ] }) Otrzymałem ten sam błąd i to rozwiązało mój problem.
Mihir Kagrana
86

Spróbuj tego:

Zaimportuj RouterModuledo swojegoapp.module.ts

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

Dodaj RouterModuledo swojegoimports []

lubię to:

 imports: [    RouterModule,  ]
Shubham Verma
źródło
5
Świetnie, to rozwiązało mój 'router-outlet' is not a known elementproblem. dla Angular CLI version: 6.0.8iAngular version: 6.0.5
Shams
37

Jeśli wykonujesz testy jednostkowe i otrzymujesz ten błąd, zaimportuj RouterTestingModuledo swoich app.component.spec.tslub wewnątrz polecanych komponentów ' spec.ts:

import { RouterTestingModule } from '@angular/router/testing';

Dodaj RouterTestingModuledo swojego imports: []polubienia

describe('AppComponent', () => {

  beforeEach(async(() => {    
    TestBed.configureTestingModule({    
      imports: [    
        RouterTestingModule    
      ],
      declarations: [    
        AppComponent    
      ],    
    }).compileComponents();    
  }));
Muhammad Adeel Malik
źródło
3
Dzięki stary, uratowałeś mi dzień.
Beto Silva
12

Zakładając, że używasz Angulara 6 z angular-cli i utworzyłeś oddzielny moduł routingu, który jest odpowiedzialny za działania routingu - skonfiguruj swoje trasy w tablicy Routes Upewnij się, że deklarujesz RouterModule w tablicy export. Kod wyglądałby tak:

@NgModule({
      imports: [
      RouterModule,
      RouterModule.forRoot(appRoutes)
     // other imports here
     ],
     exports: [RouterModule]
})
export class AppRoutingModule { }
Manit
źródło
Utworzyłem osobny plik modułu do routingu, jak wspomniano w Twojej odpowiedzi. Mam również BrowserModule, FormsModule w importach app.module i RouterModule w pliku AppRouting. Ale nadal otrzymuję ten błąd. Możesz pomóc?
ninja_md
Pomogłoby trochę kodu - część modułu routingu i część modułu aplikacji.
Manit
1
ninja_md Zaimportuj swój moduł routingu w app.module importuje tablicę. druga zmiana polegałaby na tym, że w module routingu pod @NgModule w tablicy export należy podać nazwę pliku modułu, który utworzyłeś dla routingu. Mam nadzieję, że to rozwiąże Twój problem.
M.Sharma
8

U mnie działa, gdy dodam następujący kod w app.module.ts

@NgModule({
...,
   imports: [
     AppRoutingModule
    ],
...
})
Jigar Bhatt
źródło
4

Dziękuję za przykład edytora Hero, w którym znalazłem poprawną definicję:

Kiedy generuję moduł routingu aplikacji:

ng generate module app-routing --flat --module=app

i zaktualizuj plik app-routing.ts, aby dodać:

@NgModule({
  imports: [ RouterModule.forRoot(routes) ],
  exports: [ RouterModule ]
})

Oto pełny przykład:

import { NgModule }             from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { DashboardComponent }   from './dashboard/dashboard.component';
import { HeroesComponent }      from './heroes/heroes.component';
import { HeroDetailComponent }  from './hero-detail/hero-detail.component';

const routes: Routes = [
  { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
  { path: 'dashboard', component: DashboardComponent },
  { path: 'detail/:id', component: HeroDetailComponent },
  { path: 'heroes', component: HeroesComponent }
];

@NgModule({
  imports: [ RouterModule.forRoot(routes) ],
  exports: [ RouterModule ]
})
export class AppRoutingModule {}

i dodaj AppRoutingModule do importu app.module.ts:

@NgModule({
  declarations: [
    AppComponent,
    ...
  ],
  imports: [
    BrowserModule,
    FormsModule,
    AppRoutingModule
  ],
  providers: [...],
  bootstrap: [AppComponent]
})
Kamlesh
źródło
1

Po prostu lepiej jest utworzyć komponent routingu, który obsługiwałby wszystkie Twoje trasy! Z dokumentacji strony kątowej! To dobra praktyka!

ng generuje routing aplikacji modułu --flat --module = app

Powyższy CLI generuje moduł routingu i dodaje do modułu aplikacji, wszystko, co musisz zrobić z wygenerowanego komponentu, to zadeklarować swoje trasy, również nie zapomnij dodać tego:

exports: [
    RouterModule
  ],

do dekoratora ng-module, ponieważ domyślnie nie jest dostarczany z wygenerowanym modułem routingu aplikacji!

Seyi Daniels
źródło
0

Istnieją dwa sposoby. 1. jeśli chcesz zaimplementować app.module.tsplik to:

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

const appRoutes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'user', component: UserComponent },
  { path: 'server', component: ServerComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
  ]
})
export class AppModule { }

  1. jeśli chcesz zaimplementować app-routing.module.tsplik (Separated Routing Module), to:

//app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const appRoutes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'users', component: UsersComponent },
  { path: 'servers', component: ServersComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

//................................................................

//app.module.ts
import { AppRoutingModule } from './app-routing.module';

@NgModule({
  imports: [
    AppRoutingModule
  ]
})
export class AppModule { }

Shatu
źródło
0

W moim przypadku dzieje się tak, ponieważ podczas importu brakowało RouterModule .

yibela
źródło
-1

Ten problem był ze mną również. Prosta sztuczka.

 @NgModule({
  imports: [
   .....       
  ],
 declarations: [
  ......
 ],

 providers: [...],
 bootstrap: [...]
 })

użyj go jak w powyższej kolejności. najpierw importuje, a potem deklaracje. u mnie zadziałało.

Susampath
źródło
-2

W pliku app.module.ts

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

const appRoutes: Routes = [
{
    path: '',
    redirectTo: '/dashboard',
    pathMatch: 'full',
    component: DashboardComponent
},  
{
    path: 'dashboard',
    component: DashboardComponent
}
];

@NgModule({
imports: [
    BrowserModule,
    RouterModule.forRoot(appRoutes),
    FormsModule               
],
declarations: [
    AppComponent,  
    DashboardComponent      
],
bootstrap: [AppComponent]
})
export class AppModule {

}

Dodaj ten kod. Miłego kodowania.

Vinayak Savale
źródło
-3

Oto szybkie i proste rozwiązanie, jeśli ktoś napotyka błąd:

„wylot routera” nie jest znanym elementem ”w projekcie kątowym,

Następnie,

Po prostu przejdź do pliku „app.module.ts” i dodaj następujący wiersz:

import { AppRoutingModule } from './app-routing.module';

A także „AppRoutingModule” w imporcie.

Shree
źródło