4

Я просто переключил свое приложение на сегодня, чтобы быть ленивым.
У меня есть SharedModule, который экспортирует кучу услуг. В моем AppModule я импортирую SharedModule, потому что AppComponent нуждается в доступе к нескольким общим услугам.Angular2 Lazy Loading Service был создан дважды Дважды

В другом модуле FinalReturnModule, я импортирую SharedModule. В одном из моих сервисов я ввел конструктор console.log('hi').

Когда приложение загружается, я получаю hi на консоль. Всякий раз, когда я перехожу на страницу в пределах FinalReturnModule, я снова получаю hi. Очевидно, что, поскольку есть два экземпляра, ничего не работает правильно, так как модули не могут общаться.

Как я могу остановить службу от экземпляра дважды?

EDIT: Фон, приложение построено с использованием углового кли.

Текущая версия:

angular-cli: 1.0.0-beta.24 
node: 6.9.1 
os: win32 ia32 
@angular/common: 2.4.1 
@angular/compiler: 2.4.1 
@angular/core: 2.4.1 
@angular/forms: 2.4.1 
@angular/http: 2.4.1 
@angular/platform-browser: 2.4.1 
@angular/platform-browser-dynamic: 2.4.1 
@angular/router: 3.1.1 
@angular/compiler-cli: 2.4.1 

ответ

4

Если услуга действительно предназначается, чтобы быть синглтон (один созданный один раз), не добавляйте его к любому модулю, который будет являться частью ленивым загруженным модулем (например, в SharedModule). Причина в том, что ленивый модуль получает свои собственные экземпляров услуг. Если вы хотите, чтобы служба была действительно одиночной, добавьте ее только к AppModule или к «Основному модулю», который будет импортироваться только в AppModule. Или вы можете использовать forRoot, который будет вызываться только в AppModule

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

@NgModule({ 
    declarations: [...], 
    imports: [...] 
}) 
class SharedModule { 
    static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: SharedModule, 
     providers: [ MySingletonService ] 
    } 
    } 
} 

@NgModule({ 
    imports: [ SharedModule.forRoot() ] 
}) 
class AppModule {} 

@NgModule({ 
    imports: [ SharedModule ] 
}) 
class OtherModule {} 

Теперь AppModule единственный модуль, который импортирует модуль с поставщиками.

Смотрите также:

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