2016-03-23 18 views
23

@Injectable() ile açıklamalı bir hizmet için yaşam döngüsü kancalarına sahip olmak mümkün mü?angular2 hizmetlerinde yaşam döngüsü yöntemleri

Yaşam döngüsü kancalarının böyle bir hizmette çağrılmasını beklerdim, ancak yanlış olduğunu kanıtlamıştım, yalnızca @Component üzerinde çalışıyor gibi görünüyor. Bağımlılık enjeksiyonunun bir hizmeti yarattığı/imha ettiği bir hizmette bilgi edinmenin bir yolu var mı?

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

Bu, diğer sorunun bir kopyası değildir bakın. OnDestroy'un belgeleri aslında hizmetlerin bunu desteklemesi gerektiğini belirtiyor. Ben de yanlış olduğunu kanıtlamıştım. –

cevap

23

Enjeksiyonlar sadece normal sınıflardır (normal nesneler) ve bu nedenle özel yaşam döngülerine sahip değildirler.

Sınıfınızın bir nesnesi oluşturulduğunda, sınıfın yapıcısı çağrılır, yani “OnInit” iniz budur. Yıkım gelince, bir servis gerçekten yok edilmiyor. Olabilecek tek şey, bağımlılık enjektörünün kendisinin kaldırılmasından sonra meydana gelebilecek bir referans olmadığı zaman toplanan çöpün toplanmasıdır. Fakat genellikle üzerinde herhangi bir kontrole sahip değilsiniz ve JavaScript'te bir deconstructor kavramı yoktur.

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

'constructor()' benim tahminim olurdu ve ayrıca nesnelerin çöp topladığını biliyorum. DI-yönetilen bir nesnenin yaşam döngüsü, onu sağlayan Bileşenin kapsamı ile az ya da çok tanımlandığı için, bu nesneler için bile yaşam döngüsü yöntemleri olacağını ummuştum. –

+0

Hayır, bir sağlayıcı için 'sağlayıcıların 'belirtilmesi, DI çerçevesinin orada yeni bir enjektör kullanmasını söyler; * gerçek nesne oluşturulduğunda * nasıl * veya * hakkında bir şey ifade etmez. Örneğin, yalnızca bir kez oluşturulmuş ancak ayrı ayrı (bireysel enjektörlerle) kendi yaşam döngüsüne sahip birden fazla bileşene sağlanan bir tekil nesnesini enjekte etmek için özel bir 'provid()} çağrısı kullanabilirsiniz. Hizmet yok olduğunda, – poke

+2

[ngOnDestroy] (https://angular.io/api/core/OnDestroy) çağrılır. –

6

Gösterdiğiniz ngOn * ömür döngüsü kancaları yalnızca bileşenler içindir. Başka bir hizmeti (TrackServiceLifecycles olarak adlandırın) SampleService içine enjekte edebilir ve SampleService'nin yapıcısını(), oluşturulduğunu bildirmek için diğer hizmette bir yöntem çağırın. Ancak, SampleService'nin imha edildiğinde (toplanan çöp) diğer hizmeti bildirmenin bir yolu düşünemiyorum.

diğer soru yalnızca onInit bahseder oysa o da OnDestroy bahseder çünkü ayrıca ECMAScript 6 class destructor

İlgili konular