2017-01-06 25 views
11

Poniższy kod może warunkowo załadować fałszywą usługę opartą na różnych zmiennych środowiskowych Angular-cli. Jednak efekt uboczny polega na tym, że fałszywe usługi są wbudowane w końcowe transkodowane i zminimalizowane pliki wyjściowe.Sposób ładowania modułów warunkowo w Angular 2

Czy istnieje lepszy sposób na wykonanie leniwych modułów ładujących w angular2?

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 {AppComponent} from "./app.component"; 
import {environment} from "../environments/environment"; 
import {XService} from "./xxx.service"; 
import {XMockService} from "./xxx-mock.service"; 

let importedModules: Array<any> = [ 
    XService 
]; 

if (environment.mock) { 
    importedModules.push(
    {provide: XService, useClass: XMockService} 
); 
} else { 
    importedModules.push(
    XService 
); 
} 

@NgModule({ 
    declarations: [ 
    AppComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: importedModules, 
    bootstrap: [AppComponent] 
}) 

export class AppModule {} 
+0

leniwy ładunek https://angular.io/guide/ngmodule#app-routing use loadChildren: 'app/path/to/YourModuleFileName # YourModuleClassName iw tym module możesz importować inne moduły do ​​leniwego ładowania ich ... ale w/import zakończysz pobieranie XService i XMockService. Szukam sposobu, aby pobrać tylko te moduły, które są potrzebne w czasie ładowania początkowego na podstawie hosta przy użyciu jednej podstawy kodu. hmm –

Odpowiedz

2

Można spróbować coś podobnego do tego.

main.ts

platformBrowserDynamic().bootstrapModule(RootModule); 

root.module.ts

@NgModule({ 
    imports: [ 
    LandingModule, 
    UserModule 
    ], 
    entryComponents: [PageComponent, UserComponent], 
}) 
export class RootModule { 

    constructor(private router: Router .....) { 
    } 

    ngDoBootstrap(ref: ApplicationRef) { 
    const isUserPageRequested = this.shouldGoToUser(); 
    if (isUserPageRequested) { 
     this.router.resetConfig(userRoutes); 
     ref.bootstrap(UserComponent); 
    } else { 
     ref.bootstrap(PageComponent); 
    } 
    } 
} 

PageComponent została zadeklarowana w LandingModule i UserComponent została zadeklarowana w UserModule. W ten sposób możliwe jest warunkowe ładowanie modułu, gdy działa on po skompilowaniu z aot.

+0

Bardzo pomocny. Pracował jak urok. Dzięki ! –