11

今日、アプリケーションを遅延読み込みに切り替えました。
一連のサービスをSharedModuleエクスポートする があります。私のでは、いくつかの共有サービスにアクセスする必要があるためAppModule、インポートします。SharedModuleAppComponent

別のモジュールFinalReturnModuleでは、インポートしSharedModuleます。私のサービスの 1 つでconsole.log('hi')、コンストラクターに a を入れました。

アプリが最初に読み込まhiれると、コンソールが表示されます。内のページに移動するたびに、再びFinalReturnModule取得hiします。明らかに、2 つのインスタンスがあるため、モジュールが通信できないため、何も正しく機能していません。

サービスが 2 回インスタンス化されないようにするにはどうすればよいですか?

編集: 背景、アプリは angular-cli を使用して構築されています。

現在のバージョン:

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

1 に答える 1

20

サービスが真にシングルトン (一度作成されたもの) であることを意図している場合は、遅延ロード モジュールの一部となるモジュールに追加しないでください (例: 内SharedModule)。その理由は、遅延ロードされたモジュールがサービスの独自のインスタンスを取得するためです。サービスを本当にシングルトンにしたい場合は、 にのみ追加するAppModuleか、 にのみインポートされる「コア モジュール」に追加しAppModuleます。forRootまたは、でのみ呼び出される which を使用できます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で、プロバイダーを使用してモジュールをインポートする唯一のモジュールになりました。

関連項目:

于 2016-12-23T00:53:05.320 に答える