- ngModule間で ngrxを使用して状態を共有するにはどうすればよいですか?
- ngModule 間で同じサービス インスタンスを共有するにはどうすればよいですか?
Angular2-RC5.
Angular2-RC5.
モジュールには、サービスの同じインスタンスが必要です。これを実現するには、サービスがproviders
ブートストラップAppModule
のみに含まれている必要があります。それ以外の場合、同じサービスが異なるプロバイダーで見つかった場合、並列インスタンスを実行している可能性があります。
問題は次のようになります:トップレベルproviders
でサービスを取得する方法ですが、他のすべてのモジュールから除外する方法は?
自分で作成するサービスを使用すると、非常に簡単です。
AppModule
、それをそのモジュール内に配置し、それ以外の場所にはproviders
配置しませんDummyModule
サービスが、他のモジュールにインポートしている別のモジュール ( と呼びましょう)にある場合は、それを に入れないようにしてください。そうしないと、Angular インジェクターは、遅延ロードされたすべてのモジュールに対してその並列インスタンスを作成します。輸入品。代わりに、そのサービスを静的メソッドから公開する必要があります。DummyModule
providers
DummyModule
forRoot()
だから変更:
@NgModule({
providers: [ MyService]
})
export class DummyModule{ }
に:
@NgModule({
providers: [] //empty since we want a singleton service
})
export class DummyModule{
static forRoot() {
return {ngModule: DummyModule, providers: [ MyService ]};
}
}
現在、通常のモジュールimports: [DummyModule]
の場合、それらは取得されませんMyService
。一方、では、サービスを公開していますAppModule
。imports: [DummyModule.forRoot()]
その結果、最上位のコンポーネントのみがサービスを取得し、その単一のインスタンスがすべてのモジュールで共有されます。
サードパーティのサービスでは、簡単ではありません。
基本的に、サード パーティの開発者が も使用している場合、上記の変更を行う必要があります@NgModule
。または、サードパーティ モジュールをインポートする代わりに、そのモジュールのコンポーネント、パイプ、およびディレクティブを宣言するカスタム モジュールを作成できますが、上記の変更を実装して、そのモジュールのサービスをforRoot()
メソッドに配置します。
これはMdIconService
、モジュールがまだ適切に構成されていない場合でも、サードパーティ サービス (Angular Material モジュールの一部) を単一のインスタンスとして機能させるために私が行ったことです。この github の問題を参照してください。