2016-03-23 7 views
23

Ist es möglich, Lebenszyklus-Hooks für einen Service zu haben, der mit @Injectable() gekennzeichnet ist?Lebenszyklusmethoden für Services in angular2

Ich hätte erwartet, dass die Lebenszyklus-Haken auf einem Dienst wie diesem aufgerufen werden, aber ich habe bewiesen, falsch, es scheint nur auf @Component zu arbeiten. Gibt es eine Möglichkeit, in einem Dienst informiert zu werden, wenn die Abhängigkeitsinjektion einen Dienst erstellt/zerstört?

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

auch kein Duplikat der anderen Frage Dies liegt daran, es auch OnDestroy erwähnt, während die andere Frage OnInit nur erwähnt. Die Dokumentation für OnDestroy besagt tatsächlich, dass Dienste sie unterstützen sollten. Ich wurde auch falsch bewiesen. –

Antwort

23

Injektionen sind nur normale Klassen (normale Objekte) und als solche haben sie keinen speziellen Lebenszyklus.

Wenn ein Objekt Ihrer Klasse erstellt wird, wird der Konstruktor der Klasse aufgerufen, das ist also Ihr "OnInit". Was die Zerstörung betrifft, wird ein Dienst nicht wirklich zerstört. Das einzige, was passieren kann, ist, dass es Garbage Collected sammelt, sobald es keinen Verweis mehr darauf gibt, was wahrscheinlich passiert, nachdem der Dependency Injector selbst entfernt wurde. Aber Sie haben im Allgemeinen keine Kontrolle darüber, und es gibt kein Konzept eines Dekonstruktors in JavaScript.

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

'Konstruktor()' wäre meine Vermutung gewesen, und ich weiß auch, dass Objekte Müll sammeln. Da der Lebenszyklus eines DI-verwalteten Objekts mehr oder weniger über den Umfang der Komponente definiert ist, die es bereitstellt, hatte ich gehofft, dass es auch für diese Objekte Lebenszyklusmethoden geben würde. –

+0

Nein, die Angabe von "providers" für eine Komponente weist das DI-Framework nur an, dort einen neuen Injektor zu verwenden. Es bedeutet nicht, wie * oder * wann * das eigentliche Objekt erstellt wird. Sie könnten zum Beispiel einen benutzerdefinierten Aufruf 'provide()' verwenden, um ein Singleton-Objekt zu injizieren, das nur einmal erstellt wird, aber separat (mit einzelnen Injektoren) für mehrere Komponenten mit eigenem Lebenszyklus bereitgestellt wird. – poke

+2

[ngOnDestroy] (https://angular.io/api/core/OnDestroy) wird aufgerufen, wenn ein Dienst zerstört wird. –

6

Die ngOn * Lebenszyklus-Hooks, die Sie anzeigen, sind nur für Komponenten. Sie könnten in SampleService einen anderen Dienst (nennen Sie es TrackServiceLifecycles) injizieren und SampleService-Konstruktor() rufen Sie eine Methode auf dem anderen Dienst auf, um es darüber zu informieren, dass es erstellt wurde. Aber ich kann mir keine Möglichkeit vorstellen, den anderen Dienst zu benachrichtigen, wenn SampleService zerstört wird (Garbage Collection).

Siehe ECMAScript 6 class destructor

Verwandte Themen