2016-10-18 114 views
0

我正在使用最新的Angular CLI build(16),我試圖延遲加載路由,但由於某種原因失敗,我找不到任何新的問題或解決方案爲了這。Angular 2沒有提供RouterOutletMap的延遲加載

文件夾結構:

folder structure

core.component.html:

<router-outlet></router-outlet> 

core.component.ts:

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

// Modules 
import {AdminAreaModule} from './+admin-area'; 

// Services 
import {GlobalsService, RegexService, UtilsService} from './shared'; 

// Main app component 
import {CoreComponent} from './core.component'; 

@NgModule({ 
    imports: [ 
    BrowserModule, 

    // Feature modules 
    AdminAreaModule 
    ], 
    exports: [ 
    BrowserModule 
    ], 
    declarations: [ 
    CoreComponent 
    ], 
    providers: [ 
    GlobalsService, 
    RegexService, 
    UtilsService 
    ], 
    bootstrap: [CoreComponent] 
}) 
export class CoreModule {} 

管理區域,router.module。 ts:

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

// Global modules 
import {ComponentsModule, SharedModule} from '../../shared'; 

// Lazy loaded modules 
import {AdminAreaModule} from '../admin-area.module'; 

@NgModule({ 
    imports: [ 
    RouterModule.forChild([ 
     { 
     path: 'admin', 
     loadChildren: 'app/+admin-area/admin-area.module#AdminAreaModule' 
     } 
    ]) 
    ], 
    exports: [ 
    RouterModule 
    ] 
}) 
export class AdminAreaRouterModule {} 

管理-area.module.ts:

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

import {AdminAreaRouterModule} from './router'; 

import {ComponentsModule, SharedModule} from '../shared'; 

@NgModule({ 
    imports: [ 
    ComponentsModule, 
    SharedModule, 

    // Feature modules 
    AdminAreaRouterModule 
    ], 
    exports: [ 
    ComponentsModule, 
    SharedModule, 
    AdminAreaRouterModule 
    ] 
}) 

export class AdminAreaModule {} 

這將引發一個錯誤:

Error in ./CoreComponent class CoreComponent - inline template:0:0 caused by: No provider for RouterOutletMap! 

爲什麼會出現這個錯誤時,我清楚地在我core.component.ts文件router-outlet

回答

1

您沒有在核心模塊中定義的路由,但您確實有路由器插座

因此,誤差不提供商(提供又名沒有路由)的routeroutletmap(路由器出口)

即使你有路由在你的子模塊(在這種情況下,管理模塊),您還需要添加路由到核心模塊。例如,{ path: '', redirectTo: '/admin', pathMatch: 'full' }

+0

這只是給了'最大callstack超過':| – Chrillewoodz

+0

基本上我所擁有的是網站的兩部分,一個管理區和一個普通網站。我想''''''''''''''''''''''''''''''''''''''''''可以成爲普通網站,'/所以我用自己的路由製作了兩個模塊。我是否懶惰加載核心模塊中的'/'和'/ admin'?然後他們各自的孩子在自己的路由文件? – Chrillewoodz

+0

@Chrillewoodz是的,你會在覈心模塊中延遲加載/和/管理,相應的孩子應該被捆綁在延遲加載的模塊中。 – koningdavid

1

這不是路由的工作原理。 loadChildren轉到admin的路由器不應在admin之內。它應該在更高層次上,例如,在core

作爲一個副作用,當您導入core中的路由器時,您將獲得該模塊的所有指令,包括router-outlet

看到這個資料庫這裏查看如何路由延遲加載工作:
https://github.com/meligy/routing-angular-cli

在這種回購,app類似於你core,並lazy類似於您admin

AppRoutingModule位於AppModuleNgModuleimportsAppRoutingModule有看起來像這樣的路線:

 
    { 
    path: 'lazy', 
    loadChildren: './lazy/lazy.module#LazyModule' 
    } 

(是的,你可以比較確定的路徑,例如β-17)

然後,/lazy文件夾內,LazyRoutingModuleimportsLazyModuleNgModule

LazyRoutingModule具有內部/lazy所有路由。它不知道它會是/lazy。只有AppRoutingModule知道。

LazyRoutingModule只知道AppRoutingModule爲其選擇的任何路徑,LazyRoutingModule將控制它在其下定義的子路由。

這就是爲什麼AppRoutingModule這樣定義:

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

雖然LazyRoutingModule被定義爲:

 
@NgModule({ 
    imports: [RouterModule.forChild(routes)], 
    exports: [RouterModule], 
    providers: [] 
}) 
export class LazyRoutingModule { } 

注意forRoot() VS的forChild()

隨着所有翻譯爲您的項目的話(再次,app變得core,並lazy成爲admin,如果我理解你的項目結構右),你應該能夠延遲加載admin文件夾。

讓我知道如何去。

+0

偉大的答案,我終於設法讓它工作。但我在黑暗中的一件事是,我可以看到這些塊按需加載,但只是第一次切換到特定視圖。如果我離開,然後回來,塊是否留在記憶中,或者它是如何工作的?當離開時它不應該知道關於懶惰加載模塊了嗎? – Chrillewoodz

+0

我認爲它保持了我記得的狀態,在Chrome開發工具中查看網絡。 – Meligy

+0

好的。你能看看這個http://stackoverflow.com/questions/40122820/angular-2-how-to-define-lazy-loaded-child-routes-of-a-parent-route-thats-also-l ? – Chrillewoodz

相關問題