2016-03-23 23 views
23

È possibile avere ganci del ciclo di vita per un servizio annotato con @Injectable()?Metodi del ciclo di vita per i servizi in angular2

Mi sarei aspettato che i ganci del ciclo di vita fossero chiamati su un servizio come questo, ma mi sono dimostrato sbagliato, sembra che funzioni solo su @Component. C'è un modo per essere informato in un servizio quando l'iniezione di dipendenza crea/distrugge un servizio?

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

Questo non è un duplicato della altra questione perché cita anche OnDestroy mentre l'altra domanda menziona solo OnInit. La documentazione di OnDestroy afferma in realtà che i servizi dovrebbero supportarla. Sono stato anche smentito. –

risposta

23

Iniettabili sono solo classi normali (oggetti normali) e come tali non hanno un ciclo di vita speciale.

Quando viene creato un oggetto della classe, viene chiamato il costruttore della classe, quindi è ciò che sarà "OnInit". Per quanto riguarda la distruzione, un servizio non viene realmente distrutto. L'unica cosa che potrebbe accadere è che ottiene la garbage collection una volta che non c'è più un riferimento ad essa, che probabilmente accade dopo che l'injector delle dipendenze viene rimosso da solo. Ma generalmente non ne hai il controllo, e non c'è alcun concetto di decostruttore in JavaScript.

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

'constructor()' sarebbe stata la mia ipotesi, e so anche che gli oggetti vengono raccolti dalla garbage collection. Poiché il ciclo di vita di un oggetto gestito da DI è più o meno definito dall'ambito del componente che lo fornisce, avevo sperato che esistessero metodi di ciclo di vita anche per quegli oggetti. –

+0

No, la specifica di 'provider' per un componente indica solo al framework DI di utilizzare un nuovo iniettore lì; non significa nulla su * come * o * quando * viene creato l'oggetto reale. Ad esempio, è possibile utilizzare una chiamata 'provide()' personalizzata per iniettare un oggetto singleton creato solo una volta ma fornito separatamente (con singoli iniettori) a più componenti che hanno il proprio ciclo di vita. – poke

+2

[ngOnDestroy] (https://angular.io/api/core/OnDestroy) viene chiamato quando un servizio viene distrutto. –

6

Gli hook di ciclo di vita ngOn * che vengono visualizzati sono solo per componenti. È possibile iniettare un altro servizio (chiamarlo TrackServiceLifecycles) in SampleService e fare in modo che il costruttore() di SampleService richiami un metodo sull'altro servizio per informarlo che è stato creato. Ma non riesco a pensare a un modo per notificare l'altro servizio quando SampleService viene distrutto (garbage collection).

Vedi anche ECMAScript 6 class destructor

Problemi correlati