3

コンポーネントと他のサービスの間でデータを共有するためのサービスがあります。angularのDIを使用してコンポーネントとサービスに注入しています。サービスは、一部のデータをそのプロパティに (非静的に) 格納します。また、ComponentResolver を使用して、コンポーネントを動的に作成およびロードし、それらを破棄します。問題は...単純に次を使用してコンポーネントにそのようなサービスを挿入した場合です。

constructor(private myService: MyDataService) { ... }

このサーバーの新しいインスタンスが毎回注入され、データが失われます。データを静的に保存することもできますが、このデータをサブスクライブするオブザーバーが存在します。簡単に言えば、静的変数にリファクタリングするにはあまりにも多くのことがありました。このサービスのインスタンスを 1 つだけ作成し、すべてのインジェクションで共有するように angular の DI に指示する方法はありますか?

4

1 に答える 1

1

これは、Angulars DI がプロバイダーごとに 1 つのインスタンスを維持するためです。

サービスを 1 回だけ提供する場合 (ルート コンポーネントまたはbootstrap())、インスタンスは 1 つだけになり、それを注入するすべてのサービスまたはコンポーネントは同じインスタンスを取得します。

アップデート

はい、使用する必要があります

@NgModule({
  providers: [MyService],
  ...,
})
export class AppModule {}

また

@Component({ 
  selector: 'my-app', 
  providers: [MyService], 
  ...
})
export class AppComponent {}

(または代わりにviewProviders)

注入可能なものを提供しますが、シングルトンが必要な場合は、注入可能なものを一度だけ提供するようにしてください

同じインジェクタブルを複数回提供する場合、それを提供するコンポーネントとそのすべての子孫は、それが提供される可能性のある先祖からのインスタンスではなく、このプロバイダーからインスタンスを取得します。

DI は階層的であり、現在のコンポーネントからルート コンポーネントに向かっAppModuleてプロバイダーを探します。この方法で最初に見つけたプロバイダーからインスタンスを注入します。

于 2016-05-31T12:49:06.477 に答える