2016-03-23 12 views
23

Czy możliwe jest posiadanie haseł w cyklu życia usługi oznaczonej @Injectable()?Metody cyklu życia usług w kanonach kątowych2

Spodziewałbym się, że haki w cyklu życia będą wywoływane w takiej usłudze, ale udowodniono mi, że nie działa, wydaje się, że działa tylko na @Component. Czy istnieje sposób na uzyskanie informacji w usłudze, gdy wtrysk zależności tworzy/niszczy usługę?

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

To nie jest duplikat innej kwestii, ponieważ również wspomina OnDestroy natomiast tylko druga kwestia wspomina OnInit. Dokumentacja OnDestroy stwierdza, że ​​usługi powinny ją wspierać. Udowodniono mi też, że nie tak. –

Odpowiedz

23

Wyroby iniekcyjne są normalnymi klasami (normalnymi obiektami) i jako takie nie mają specjalnego cyklu życia.

Kiedy tworzony jest obiekt twojej klasy, wywoływany jest konstruktor klasy, więc to właśnie będzie twoje "OnInit". Jeśli chodzi o zniszczenie, usługa naprawdę nie zostanie zniszczona. Jedyne, co może się zdarzyć, to to, że zbiera śmieci, gdy nie ma już odniesienia do niego, co prawdopodobnie ma miejsce po usunięciu wtryskiwacza zależnego. Ale generalnie nie masz nad nim kontroli i nie ma koncepcji dekonstruktora w JavaScript.

+0

'constructor()' to był mój domysł, a także wiem, że obiekty zbierają śmieci. Ponieważ cykl życia obiektu zarządzanego przez DI jest mniej lub bardziej zdefiniowany poprzez zakres Komponentu, który to zapewnia, miałem nadzieję, że istnieją metody cyklu życia nawet dla tych obiektów. –

+0

Nie, określenie "dostawcy" dla komponentu mówi tylko strukturze DI, aby używał tam nowego wtryskiwacza; nie oznacza nic o * jak * lub * kiedy * rzeczywisty obiekt jest tworzony. Można na przykład użyć niestandardowego wywołania 'provide()' w celu wstrzyknięcia obiektu singleton, który jest tworzony tylko raz, ale dostarczany osobno (z poszczególnymi wtryskiwaczami) do wielu komponentów, które mają swój własny cykl życia. – poke

+2

[ngOnDestroy] (https://angular.io/api/core/OnDestroy) jest wywoływany, gdy usługa jest niszczona. –

6

Pokazane haki cyklu życia ngOn * dotyczą tylko komponentów. Możesz wprowadzić inną usługę (nazwij ją TrackServiceLifecycles) do SampleService i wywołać metodę SampleService za pomocą metody w innej usłudze, aby poinformować ją, że została utworzona. Ale nie mogę wymyślić sposób powiadomienia drugiej usługi, gdy SampleService jest zniszczony (śmieci zostały zebrane).

Zobacz także ECMAScript 6 class destructor

Powiązane problemy