2016-03-23 10 views
23

@Injectable()という注釈が付いたサービスにライフサイクルフックを付けることは可能ですか?angular2のサービスのライフサイクルメソッド

私はこのようなサービスでライフサイクルフックを呼び出すと予想していましたが、私は間違っていると証明されました。それは@Componentでしか動作していないようです。依存関係注入がサービスを作成/破壊するときに、サービスに情報を得る方法はありますか?

import {Component, Injectable, OnInit, OnDestroy} from 'angular2/core'; 

@Injectable() 
export class SampleService implements OnInit, OnDestroy { 
    ngOnInit() { 
     console.log("OnInit") 
    } 
    ngOnDestroy() { 
     console.log("OnDestroy") 
    } 
} 

@Component({ 
    selector: "sample", 
    template: "<div>Sample Component</div>", 
    providers: [ SampleService ] 
}) 
export class SampleComponent { 
    constructor() { private _sampleService: SampleService } 
} 
+3

これは他の質問の重複ではありません。 OnDestroyのドキュメンテーションは実際にはサービスがそれをサポートすべきだと述べています。私も間違っていることが判明した。 –

答えて

23

注射剤は通常のクラス(通常のオブジェクト)であるため、特別なライフサイクルはありません。

クラスのオブジェクトが作成されると、そのクラスのコンストラクタが呼び出されます。そのため、あなたの "OnInit"はそうです。破壊に関しては、サービスは本当に破壊されません。発生する可能性のある唯一の事は、それへの参照がなくなればガーベッジ・コレクションが得られることです。これは、依存性インジェクタが削除された後に起こる可能性があります。しかし、一般的にそれを制御することはできません.JavaScriptにはデコンストラクタという概念はありません。

@Injectable() 
export class SampleService { 
    constructor() { 
     console.log('Sample service is created'); 
    } 
} 
+0

'constructor()'は私の推測でしたが、オブジェクトがガベージコレクションされることも知っています。 DI管理対象オブジェクトのライフサイクルは、提供するコンポーネントの範囲で多かれ少なかれ定義されているため、これらのオブジェクトでもライフサイクルメソッドが存在することを期待していました。 –

+0

いいえ、コンポーネントに 'providers'を指定すると、DIフレームワークに新しいインジェクタを使用するよう指示されます。実際のオブジェクトがどのように作成されたかについては何も意味しません。たとえば、独自のライフサイクルを持つ複数のコンポーネントに対して個別に(個々のインジェクタを使用して)個別に提供されるシングルトンオブジェクトを注入するカスタムの 'provide()'呼び出しを使用できます。 – poke

+2

[ngOnDestroy](https://angular.io/api/core/OnDestroy)は、サービスが破棄されたときに呼び出されます。 –

6

あなたが表示するngOn *ライフサイクルフックは、コンポーネントのみです。別のサービス(TrackServiceLifecyclesと呼ぶ)をSampleServiceに挿入し、SampleServiceのconstructor()が他のサービスのメソッドを呼び出して、それが作成されたことを通知することができます。しかし、私は、SampleServiceが破壊されたとき(ゴミ収集されたとき)、他のサービスに通知する方法を考えることはできません。他の質問は唯一のOnInit言及し、一方、それはまた、OnDestroy言及しているため

も参照してくださいECMAScript 6 class destructor

関連する問題