2016-08-14 1 views
2

Я создаю приложение углового 2 RC5, и каждый модуль лениво загружен. Когда приложение запускается, он отображает список из LocalizationListComponent, как и предполагалось, но на консоли есть сообщение, которое сообщает Cannot find primary outlet to load 'LocalizationListComponent'. Учитывая, что список отображается, а ошибка возникает из-за того, что сам компонент очень странный и необычный.Не удается найти основной выход для загрузки 'LocalizationListComponent'

Для этого необходимо добавить <router-outlet> вместе с ROUTER_DIRECTIVES к каждому компоненту и виду, на которые влияет эта ошибка. Проблема в том, что список будет представлен дважды, и в этом списке загрузится экран подробностей. Это не то поведение, которое я хочу.

После этого я прошел урок Angular 2 Routing на angular.io, и я проверил их код плункера. Все кажется идентичным, но ошибка сохраняется.

Я загрузил приложение к раздаточной (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, но они в основном иметь дело с отсутствующими ROUTER_DIRECTIVES, которые я имею в app.component.ts

Спасибо за вашу помощь людям!

+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); 

Это должен сделать трюк в качестве основного маршрута компонента будет вызывать loadChildren указывая на SomeParentComponent.

Смежные вопросы