3
  1. ngModule間で ngrxを使用して状態を共有するにはどうすればよいですか?
  2. ngModule 間で同じサービス インスタンスを共有するにはどうすればよいですか?

Angular2-RC5.

4

1 に答える 1

5

モジュールには、サービスの同じインスタンスが必要です。これを実現するには、サービスがprovidersブートストラップAppModuleのみに含まれている必要があります。それ以外の場合、同じサービスが異なるプロバイダーで見つかった場合、並列インスタンスを実行している可能性があります。

問題は次のようになります:トップレベルprovidersでサービスを取得する方法ですが、他のすべてのモジュールから除外する方法は?

自分で作成するサービスを使用すると、非常に簡単です。

  • サービスが の一部である場合はAppModule、それをそのモジュール内に配置し、それ以外の場所にはproviders配置しません
  • DummyModuleサービスが、他のモジュールにインポートしている別のモジュール ( と呼びましょう)にある場合は、それを に入れないようにしてください。そうしないと、Angular インジェクターは、遅延ロードされたすべてのモジュールに対してその並列インスタンスを作成します。輸入品。代わりに、そのサービスを静的メソッドから公開する必要があります。DummyModuleprovidersDummyModuleforRoot()

だから変更:

@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。一方、では、サービスを公開していますAppModuleimports: [DummyModule.forRoot()]その結果、最上位のコンポーネントのみがサービスを取得し、その単一のインスタンスがすべてのモジュールで共有されます。

サードパーティのサービスでは、簡単ではありません。

基本的に、サード パーティの開発者が も使用している場合、上記の変更を行う必要があります@NgModule。または、サードパーティ モジュールをインポートする代わりに、そのモジュールのコンポーネント、パイプ、およびディレクティブを宣言するカスタム モジュールを作成できますが、上記の変更を実装して、そのモジュールのサービスをforRoot()メソッドに配置します。

これはMdIconService、モジュールがまだ適切に構成されていない場合でも、サードパーティ サービス (Angular Material モジュールの一部) を単一のインスタンスとして機能させるために私が行ったことです。この github の問題を参照してください。

于 2016-08-27T15:47:17.477 に答える