2016-08-14 39 views
2

我正在創建一個Angular 2 RC5應用程序,並且每個模塊都被加載。當應用程序啓動時,按照預期顯示LocalizationListComponent的列表,但在控制檯中有一條消息,內容爲Cannot find primary outlet to load 'LocalizationListComponent'。考慮到列表顯示,錯誤抱怨這個組件是非常奇怪和不尋常的。找不到要加載的主要插件'LocalizationListComponent'

爲了解決這個問題,我需要將<router-outlet>ROUTER_DIRECTIVES一起添加到受此錯誤影響的每個組件和視圖中。問題在於列表將顯示兩次,詳細信息屏幕將在此列表下加載。這不是我想要的行爲。

在此之後,我經歷了angular.io上的Angular 2 Routing tutorial,並檢查了他們的plunker代碼。一切似乎都是一樣的,但錯誤依然存在。

我上傳應用程序的Dropbox(inactive link

這裏有模塊,線路和組件(我的一長串道歉):

app.routes.ts

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

const routes: Routes = [ 
    { 
     path: "", 
     redirectTo: "/localizations", 
     pathMatch: "full" 
    }, 
    { 
     path: "localizations", 
     loadChildren: "./app/modules/localization/localization.module", 
    } 
]; 

export const appRoutes = RouterModule.forRoot(routes); 

app.module.ts

import { NgModule } from "@angular/core"; 
import { BrowserModule } from "@angular/platform-browser"; 
import { appRoutes } from "../routes/app.routes" 

import { AppComponent } from "../components/app.component"; 
import { AppNavigationComponent } from "../components/app-navigation.component"; 
import { AppStartComponent } from "../components/app-start.component"; 

import { LoggerModule } from "./logging/logger.module"; 
import { SharedModule } from "./shared/shared.module"; 

@NgModule({ 
    imports: [ BrowserModule, LoggerModule.forRoot(), SharedModule, appRoutes ], 
    declarations: [ AppComponent, AppNavigationComponent, AppStartComponent ], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { 

} 

app.component.ts

/// <reference path="../../typings/globals/node/index.d.ts" /> 

import { Component, OnInit, OnDestroy } from "@angular/core"; 
import { ActivatedRoute, Router, ROUTER_DIRECTIVES } from "@angular/router"; 
import { AppNavigationComponent } from "./app-navigation.component"; 

import { LoggerMessageType } from "../modules/logging/models/enums/LoggerMessageType"; 
import { AbstractLogger } from "../modules/logging/interfaces/AbstractLogger"; 

@Component({ 
    moduleId: module.id, 
    selector: "vms-localization-app", 
    templateUrl: "../views/app.component.html", 
    directives: [ ROUTER_DIRECTIVES ] 
}) 
export class AppComponent { 
    status: string; 

    constructor(private logger: AbstractLogger) { 
     this.status = "Alpha 0.1"; 
    } 

    ngOnInit() : any { 

    } 

    ngOnDestroy() : any { 

    } 
} 

localization.module.ts

import { NgModule } from "@angular/core"; 
import { RouterModule } from "@angular/router"; 
import { CommonModule } from "@angular/common"; 
import { FormsModule } from "@angular/forms"; 
import { localizationRoutes } from "./routes/localization.routes"; 

import { LocalizationListComponent } from "./components/localization-list.component"; 
import { LocalizationDetailsComponent } from "./components/localization-details.component"; 

import { AbstractLocalizationService } from "./interfaces/AbstractLocalizationService"; 
import { MockLocalizationService } from "./services/mock-localization.service"; 

@NgModule({ 
    imports: [ localizationRoutes, CommonModule, FormsModule, RouterModule ], 
    declarations: [ LocalizationListComponent, LocalizationDetailsComponent ], 
    providers: [ { provide: AbstractLocalizationService, useClass: MockLocalizationService } ] 
}) 
export default class LocalizationModule { 

} 

localization.routes.ts

import { Routes, RouterModule } from "@angular/router"; 
import { LocalizationListComponent } from "../components/localization-list.component"; 
import { LocalizationDetailsComponent } from "../components/localization-details.component"; 

const routes: Routes = [ 
    { 
     path: "", 
     component: LocalizationListComponent, 
     children: [ 
      { 
       path: "localization", 
       component: LocalizationListComponent 
      }, 
      { 
       path: ":id", 
       component: LocalizationDetailsComponent 
      }, 
      { 
       path: "", 
       component: LocalizationListComponent 
      } 
     ] 
    } 
]; 

export const localizationRoutes = RouterModule.forChild(routes); 

定位,list.component.ts

import { Component, OnInit } from "@angular/core"; 
import { Localization } from '../models/localization'; 
import { Language } from "../models/language"; 

import { AbstractLocalizationService } from "../interfaces/AbstractLocalizationService"; 
import { AbstractLogger } from "../../logging/interfaces/AbstractLogger"; 
import { LoggerMessageType } from "../../logging/models/enums/LoggerMessageType"; 

@Component({ 
    moduleId: module.id, 
    selector: "localization-list", 
    templateUrl: "../views/localization-list.component.html" 
}) 
export class LocalizationListComponent implements OnInit { 
    localizations: Localization[]; 
    languages: Language[]; 

    constructor(private localizationService: AbstractLocalizationService, 
      private logger: AbstractLogger) { 

    } 

    ngOnInit() : any { 
     this.localizationService.getLocalizations() 
      .subscribe((result: Localization[]) => { 
       this.localizations = result; 
       this.languages = this.localizations[0].languages; 
      }); 
    } 
} 

app.component.html

<div class="container"> 
    <div class="page-header"> 
     <h1>VMS Localization<small>{{ status }}</small></h1> 
     <app-navigation></app-navigation> 
    </div> 

    <router-outlet></router-outlet> 
</div> 

一定有什麼不對上述片段(和提供的項目),但我看不到任何它。

我還檢查StackOverflow的其他問題,但他們大多缺少,我有在app.component.ts

感謝您的幫助人們應對ROUTER_DIRECTIVES!

+0

你'app.module.ts'和'app.routes.ts'是一樣的。編輯它? – candidJ

+0

@candidJ感謝您的注意。我更新了'app.module.ts' –

回答

6

我剛剛在GitHub上遇到了一個問題(https://github.com/angular/angular/issues/10686),其中解釋了這是一種有意的行爲。每個擁有children(並且看起來與loadChildren相同)的父母都必須擁有自己的加載子女的出口。

看來這沒有記錄在Router documentation的任何地方。

UPDATE: 在聲明中模塊的路由器children,每個父母必須有它自己的<router-outlet></router-outlet>以加載這個孩子。如何實施這取決於需求。對於我的解決方案,我創建了一個只包含<router-outlet></router-outlet>一個空組件並將其定義爲以下途徑:

import { Routes, RouterModule } from "@angular/router" 
import { SomeParentComponent } from "./app/modules/SomeModule/SomeParentComponent" 
import { SomeChildComponent1 } from "./app/modules/SomeModule/SomeChild1Component" 
import { SomeChildComponent2 } from "./app/modules/SomeModule/SomeChild2Component" 

const routes: Routes = [ 
    path: "", 
    component: SomeParentComponent, 
    children: [ 
     { 
      path: "", 
      component: SomeChild1Component 
     }, 
     { 
      path: ":id", 
      component: SomeChild2Component 
     } 
    ] 
] 

export const someModuleRoutes = RouterModule.forChild(routes); 

這應該做的伎倆爲主要成分的路線將調用loadChildrenSomeParentComponent指向。