2016-05-31 5 views
3

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

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

このサーバーの新しいインスタンスを毎回注入され、データが失われます。私はデータを静的に保存することができましたが、このデータを購読するオブザーバーがいます。長い話が短い - 静的変数にリファクタリングするには余りにも多くのこと。 AnglesのDIにこのサービスのインスタンスを1つ作成し、すべてのシングルインジェクションで共有するように指示する方法はありますか?

答えて

1

Angulars DIは、プロバイダ

ごとに単一インスタンスを維持しますので、これはあなたが一度だけ(ルートコンポーネントまたはbootstrap())サービスを提供する場合は、唯一のインスタンスと注入し、すべてのサービスまたはコンポーネントがあるでしょうですそれは同じインスタンスを取得します。

更新

はい、あなたが持っている使用

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

または

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

(あるいはviewProviders

へのPRあなたがシングルトンを持っていることを望むならば、一度だけ注射できるようにしてください

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

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

+0

右、コンストラクタでDIを使用するために、ブーストラップまたは少なくともビュープロバイダを使用する必要はありませんか?すべてのインジェクションされたサービスがシングルトンだと私は理解しています。私はそれが新しいインスタンスとしてそれを行うことが可能であるかどうかはわかりませんでした.. –

+0

コメントを長くしていたからです。 –

+0

ありがとうございました! – marius

関連する問題