Enjekte edilebilir sınıf Örneklendiğinde ngOnInit çağrılmıyor


197

ngOnInit()Bir Injectablesınıf çözüldüğünde neden çağrılmıyor ?

kod

import {Injectable, OnInit} from 'angular2/core';
import { RestApiService, RestRequest } from './rest-api.service';

@Injectable()
export class MovieDbService implements OnInit {

    constructor(private _movieDbRest: RestApiService){
        window.console.log('FROM constructor()');
    }

    ngOnInit() {
         window.console.log('FROM ngOnInit()');
    }

}

Konsol Çıkışı

FROM constructor()

Yanıtlar:


313

OnInit()Direktifler ve Bileşenler ile çalışmak gibi yaşam döngüsü kancaları . Sizin durumunuzdaki bir hizmet gibi başka türlerle çalışmazlar. Dokümanlar'dan:

Bir Bileşenin Angular tarafından yönetilen bir yaşam döngüsü vardır. Açısal onu oluşturur, oluşturur, çocuklarını oluşturur ve oluşturur, veriye bağlı özellikleri değiştiğinde kontrol eder ve DOM'dan kaldırmadan önce yok eder.

Angular bunları oluştururken, güncellerken ve yok ederken yönerge ve bileşen örnekleri bir yaşam döngüsüne sahiptir.


38
Yani basitçe ngOnInitmantığımı Injectablesınıflar için kurucuya taşımak mı? Herhangi bir nedenden dolayı herhangi bir mantığı kurucudan uzak tutmanız gerektiğini okudum.
Levi Fuller

48
@LeviFuller Yea, hizmetler için yapıcıda başlatma yapabilir veya init yöntemini daha iyi yapabilir ve yapıcıdan çağırabilirsiniz (daha sonra bir hizmeti sıfırlamanız gerekirse).
Ocak'ta Sasxa

9
Tam olarak değil, OnInit ciltleme ile ilgilidir. Yapıcıda bulunmadığından, giriş değerlerinin çözümlenmesini beklemek istediğinizde bunu kullanırsınız. Yapıcı birden çok kez çağrılabilir. Örneğin, rotayı değiştirip farklı bileşenler yüklediğinizde, her seferinde "inşa edilir" ve yok
edilirler

5
O Hizmetlerimiz burada belirtmekte fayda var olabilir sen ekleyene yere bağlı olarak birden çok kez örneği providersdiziler. Tektonlu bir hizmet istiyorsanız, bunu ana modülünüze koyun providersve bileşen başına hizmet istiyorsanız bunları doğrudan bileşene ekleyin.
Askdesigners

4
Cevapta @ SBD580 puanları olduğu için bu tamamen yanlış değilngOnDestroy
shusson

48

Tüm yaşam döngüsü kancalarını bilmiyorum, ama yıkıma gelince, ngOnDestroy gelince, sağlayıcı yok edildiğinde (örneğin bir bileşen tarafından sağlanan bir Enjeksiyonluk) aslında Enjektabl'i çağırınız.

Gönderen docs :

Direktif, boru veya servis imha edildiğinde çağrılan yaşam döngüsü kancası .

Herhangi birinin yıkımla ilgilenmesi durumunda bu soruyu kontrol edin :


2
Böyle bir utanç ngOnInit. çağrılmaz :-( Gerçekten bazı şeffaf gecikmeli başlatma büyü yapmak isteseydim ngOnDestroyben görmüyorum çağrılabilir neden init olamaz
Simon_Weaver

2

Not: Bu cevap hizmetler değil, yalnızca Açısal bileşenler ve direktifler için geçerlidir.

ngOnInitBileşenlerim için (ve diğer yaşam döngüsü kancaları) ateşlemediğinde de aynı sorunu yaşadım ve çoğu arama beni buraya getirdi.

Sorun şu =>gibi ok işlevi sözdizimi ( ) kullanıyordu:

class MyComponent implements OnInit {
    // Bad: do not use arrow function
    public ngOnInit = () => {
        console.log("ngOnInit");
    }
}

Görünüşe göre bu Açısal 6'da çalışmaz. Ok olmayan işlev sözdiziminin kullanılması sorunu giderir:

class MyComponent implements OnInit {
    public ngOnInit() {
        console.log("ngOnInit");
    }
}

Enjekte edilebilir sınıflar Bileşenler değil, Hizmetler'dir. OP bir Servis sorar. Cevabınız bir dil POV'sinden doğru olsa da, bu soruya cevap vermiyor. Silmelisiniz.
Andrew Philips

@AndrewPhilips benim kullanım durumum OP'lerden biraz farklı olsa da, "ngOnInit çağrılmadı" için bir google araması insanları buraya yönlendirir. Bu cevapla hedefim OP'ye değil, benzer sorunları olan 70.000'den fazla izleyiciye yardımcı olmak ngOnInit.
AJ Richardson

Yeterince adil. Bir yazarın kendi sorusunu sorduğu ve cevapladığı SO Soru-Cevaplarını gördüğüme inanıyorum. Yeni bir Açısal programcı olarak cevabınız iki hafta önce kafamı karıştırırdı. Hem SO hem de NG açısından, cevabınızın kendi Sorusuna layık olduğunu düşünüyorum, bu yüzden silinmedi, ancak “yeniden sınıflandırıldı”. Kim bilir? Belki daha da geniş bir kitleye ulaşabilir. Şerefe.
Andrew Philips

1
Mantıklı - Bunun hizmetler için olmadığını açıklamak için cevabımı düzenledim.
AJ Richardson


0
import {Injectable, OnInit} from 'angular2/core';
import { RestApiService, RestRequest } from './rest-api.service';
import {Service} from "path/to/service/";

@Injectable()
export class MovieDbService implements OnInit {

userId:number=null;

constructor(private _movieDbRest: RestApiService,
            private instanceMyService : Service ){

   // do evreything like OnInit just on services

   this._movieDbRest.callAnyMethod();

   this.userId = this.instanceMyService.getUserId()


}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.