2017-01-25 2 views
10

Ich habe eine einfache App mit Routing erstellt. -Links "http: // localhost: 4200" und "http: // localhost: 4200/mail" gut funktionieren,Angular2 Router: Fehler: Primäre Steckdose zum Laden von "InboxComponent" nicht gefunden

aber wenn ich versuche, einen Link "http zu öffnen: // localhost: 4200/mail/inbox "Ich erhalte eine Fehlermeldung:" Kann 'Primary outlet' nicht finden, um 'InboxComponent' zu laden. "

Was verursacht den Fehler und wie kann ich es beheben?

Hier sind meine * .ts Dateien:

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 { RouterModule } from '@angular/router'; 

import { AppComponent } from './app.component'; 
import { MailListComponent } from './components/mail-list/mail-list.component'; 
import { FoldersComponent } from './components/folders/folders.component'; 
import { InboxComponent } from './components/inbox/inbox.component'; 

const routes = [ 
    { path: '', 
    component: MailListComponent 
    }, 

    { path: 'mail', component: MailListComponent, 
     children: [ 
     {path: 'inbox', component: InboxComponent} 
     ] 
    } 
]; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    MailListComponent, 
    FoldersComponent, 
    InboxComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    RouterModule.forRoot(routes) 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

app.component.ts:

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

@Component({ 
    selector: 'app-root', 
    template: ` 
    <app-folders></app-folders> 
    <router-outlet></router-outlet> 
    `, 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent { 
    title = 'app works!'; 
} 

folders.component .ts:

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

@Component({ 
    selector: 'app-folders', 
    template: ` 
    <aside class="folders"> 
     <ul> 
     <li><a routerLink="mail/inbox">Inbox</a></li> 
     </ul> 
    </aside> 
    `, 
    styleUrls: ['./folders.component.css'] 
}) 
export class FoldersComponent { 
    folders: any[]; 

    constructor() { } 

} 

Mail-list.component.ts:

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

@Component({ 
    selector: 'app-mail-list', 
    template: ` 
    <p> 
     Mail list works! 
    </p> 
    `, 
    styleUrls: ['./mail-list.component.css'] 
}) 
export class MailListComponent { 

    constructor() { } 

} 

inbox.component.ts:

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

@Component({ 
    selector: 'app-inbox', 
    template: ` 
    <p> 
     inbox works! 
    </p> 
    `, 
    styleUrls: ['./inbox.component.css'] 
}) 
export class InboxComponent implements OnInit { 

    constructor() { } 

    ngOnInit() { 
    } 

} 
+0

Mögliche Duplikat Host [Angular2 Router-Fehler: kann nicht primäre Ausgang finden laden ‚HomePage‘] (https://stackoverflow.com/questions/37950413/angular2-router-error-cannot-find-primary-outlet-to-load-homepage) – ishandutta2007

Antwort

18

Ihre MailListComponent braucht eine <router-outlet> auch, weil InboxComponent definiert ist als Kind in Ihrer Routerkonfiguration:

@Component({ 
    selector: 'app-mail-list', 
    template: ` 
    <p> 
     Mail list works! 
    </p> 
    <router-outlet></router-outlet> 
    `, 
    styleUrls: ['./mail-list.component.css'] 
}) 
export class MailListComponent { 

    constructor() { } 

} 

Wenn Sie jedoch die InboxComponent innerhalb derselben Steckdose machen möchten, können Sie es als Kind nicht hinzufügen sollten

+0

Vielen Dank! Es ist die einzige Antwort von vielen, die mir wirklich geholfen haben. Ich habe jedoch keine Ahnung, wie Angular bestimmt, dass die Komponente ein Kind ist (ich habe keine Kindroute wie der Autor und immer noch denkt Angular aus irgendeinem Grund, dass es eine Kindkomponente ist). Irgendwelche Ideen wo finde ich eine Konfiguration dieser Beziehung? –

+0

Sie haben eine untergeordnete Route, weil "Posteingang" im "Kinder" -Array von "Mail" ist :) – PierreDuc

2

Ein anderer Weg, wenn Sie das Hinzufügen einer <router-outlet></router-outlet> vermeiden möchten, ist die Art und Weise definieren Sie Ihre Routen in sich ändern die folgenden:

const routes = [ 
    { path: '', 
    children: [ 
     { 
     path: '', 
     component: MailListComponent 
     } 
    ] 
    }, 
    { path: 'mail', 
    children: [ 
     { 
     path: '', 
     component: MailListComponent 
     }, 
     { 
     path: 'inbox', 
     component: InboxComponent 
     } 
    ] 
    } 
]; 

Dies ermöglicht Ihnen, die gleiche <router-outlet></router-outlet> wie oben zu verwenden, um die neue Komponente

Verwandte Themen