web-dev-qa-db-ja.com

Angular2のサービスのライフサイクルメソッド

@Injectable()アノテーションが付けられたサービスにライフサイクルフックを設定することは可能ですか?

ライフサイクルフックがこのようなサービスで呼び出されることを期待していましたが、間違っていたことが証明されました。@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 }
}
33
Martin C.

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

クラスのオブジェクトが作成されると、クラスのコンストラクターが呼び出されるため、「OnInit」がそうなります。破壊に関しては、サービスは実際には破壊されません。唯一発生する可能性があるのは、参照がなくなるとガベージコレクションが行われることです。これは、依存関係インジェクター自体が削除された後に発生する可能性があります。ただし、通常はそれを制御することはできず、JavaScriptにはデコンストラクターの概念はありません。

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

表示するngOn *ライフサイクルフックは、コンポーネント専用です。別のサービスをTrackServiceLifecyclesと呼び、SampleServiceに注入し、SampleServiceのconstructor()が他のサービスのメソッドを呼び出して、作成されたことを通知することができます。しかし、SampleServiceが破棄された(ガベージコレクションされた)ときに他のサービスに通知する方法は考えられません。

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

10
Mark Rajcok