2017-02-03 2 views
1

Я реализовал в приложение ленивые модули загрузки, правильно настроен app.module.ts.Угловой 2 ленивый загруженный модуль - сервис не singleton

@NgModule({ 
    declarations: [ 
    AppComponent, 
    HeaderComponent, 
    HomeComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    routing 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

Конфигурация маршрутизация

const APP_ROUTES: Routes = [ 
    { path: '', component: HomeComponent }, 
    { path: 'tools', loadChildren: 'app/tools/tools.module#ToolsModule' } 
]; 

export const routing = RouterModule.forRoot(APP_ROUTES); 

предоставление услуги через поле провайдеров в модуле ребенка и переключение между компонентами этого модуля reinstantiates этой услуги (проверено, войдя в конструкторе службы).

Услуга предоставляется только в модуле.

@NgModule({ 
    declarations: [ 
    ToolsComponent, 
    ToolsCartComponent, 
    ToolsContainerComponent, 
    ToolsFormComponent 
    ], 
    imports: [ 
    CommonModule, 
    toolsRouting 
    ], 
    providers: [ToolsService] 
}) 
export class ToolsModule { } 

Почему не предоставляемый сервис не является ничем иным?

РЕДАКТИРОВАТЬ:

Я изменил пример plunker для ленивых модулей загрузки путем добавления услуги область действия только к этому модуль (модуль бэкэнд в данном случае). Переключение между BackendComponent и BackendSecondComponent (которые оба объявлены под ленивым загруженным модулем) служба получает пересоздана (отображается в консоли)

Plunker link

+0

Имея ту же проблему, я считаю, что это потому, что метод .forRoot() не вызывается при ленивой загрузке модуля ... Я ищу аналогичное решение, но мне нужно, чтобы мой сервис был синглом. .cheers – Spock

+0

У схожих проблем. Каждый раз, когда я открываю маршрут с ленивым загруженным модулем, создается новая услуга, несмотря на то, что поставщик услуг находится на уровне модуля. – mrh

+0

Я уверен, что вы уже знаете об этом для работы (для предоставления услуги в модуле приложения). Рабочий плункер: https://plnkr.co/edit/UnxciqNLfL80BotWsYri?p=preview. Следует отметить, что это предупреждение: [Ссылка на документацию по модулю Angular2] (https://angular.io/docs/ts/latest/guide/ngmodule.html#!#why-_userservice_-isn-t-shared). В doc говорит: «Не указывайте поставщиков одноранговых приложений в общем модуле. Ленивый загруженный модуль, который импортирует этот общий модуль, сделает свою собственную копию службы». _ Это связано с этим, но я не знаю, основной причиной. – echonax

ответ

0

Я думаю, что это та же проблема, как этот пост StackOverflow: How do I provide a service in a lazy-loaded module and have that service scoped to just the lazy-loaded module and its components?

Решение было создать «корневой компонент» в ленивом загруженного модуля и добавить компоненты этого нового корневого компонента.

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