ngOnInit को तब नहीं बुलाया जा सकता है जब Injectable क्लास Instantiated हो


197

ngOnInit()जब Injectableक्लास हल हो जाती है तो उसे क्यों नहीं बुलाया जाता है?

कोड

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()');
    }

}

कंसोल आउटपुट

FROM constructor()

जवाबों:


312

जीवनचक्र के हुक , OnInit()निर्देशों और घटकों के साथ काम करते हैं। वे अन्य प्रकार के साथ काम नहीं करते हैं, जैसे आपके मामले में सेवा। डॉक्स से:

एक कंपोनेंट में एक जीवनचक्र होता है जिसे एंगुलर द्वारा प्रबंधित किया जाता है। कोणीय इसे बनाता है, इसे प्रस्तुत करता है, अपने बच्चों को बनाता है और प्रदान करता है, इसे तब चेक करता है जब इसका डेटा-बाउंड गुण बदल जाता है और इसे DOM से हटाने से पहले इसे नष्ट कर देता है।

निर्देश और घटक उदाहरणों में एक जीवनचक्र होता है जैसा कि कोणीय बनाता है, अद्यतन करता है, और उन्हें नष्ट कर देता है।


38
तो बस कक्षाओं के ngOnInitलिए कंस्ट्रक्टर के लिए मेरे तर्क को स्थानांतरित करें Injectable? मुझे यह पढ़कर याद आया कि आपको किसी भी कारण से किसी भी तर्क को रचनाकार से दूर रखना चाहिए।
लेवी फुलर

48
@LeviFuller Yea, सेवाओं के लिए आप कंस्ट्रक्टर में इनिशियलाइज़ेशन कर सकते हैं, या बेहतर इनिट मेथड कर सकते हैं और इसे कंस्ट्रक्टर से कॉल कर सकते हैं (यदि आपको बाद में किसी सर्विस को रीसेट करने की आवश्यकता है तो)।
शसक्सा

9
बिल्कुल नहीं, OnInit को बाइंडिंग के साथ करना है। आप इसका उपयोग तब करते हैं जब आप इनपुट मानों को हल करने के लिए इंतजार करना चाहते हैं, क्योंकि वे कंस्ट्रक्टर में उपलब्ध नहीं हैं। कंस्ट्रक्टर को कई बार कहा जा सकता है। उदाहरण के लिए, जब आप मार्ग बदलते हैं और विभिन्न घटकों को लोड करते हैं, तो वे "निर्मित" हो जाते हैं और हर बार नष्ट हो जाते हैं ...
सक्साका

5
यहां यह भी ध्यान देने योग्य है कि सेवियों को कई बार इंस्टेंट किया जा सकता है, इस पर निर्भर करता है कि आप उन्हें providersसरणियों में कहां शामिल करते हैं। यदि आप एक सिंगलटन सेवा चाहते हैं, तो इसे अपने मुख्य मॉड्यूल में डालें providers, और यदि आप चाहते हैं कि प्रति-घटक सेवाएँ उन्हें सीधे घटक में जोड़ें।
Askdesigners

4
यह पूरी तरह से गलत नहीं है, जैसा कि @ SBD580 अंक उनके उत्तर में है, ngOnDestroyको इंजेक्शन सेवाओं के लिए कहा जाता है
shusson

48

मैं सभी जीवनचक्र के हुक के बारे में नहीं जानता, लेकिन विनाश के लिए, ngOnDestroyवास्तव में इसे प्राप्त होने पर इंजेक्टेबल कहा जाता है जब प्रदाता नष्ट हो जाता है (उदाहरण के लिए एक घटक द्वारा आपूर्ति की गई इंजेक्शन)।

वहाँ से docs :

जीवनचक्र हुक जिसे निर्देश, पाइप या सेवा नष्ट होने पर कहा जाता है।

अगर किसी को नष्ट करने में दिलचस्पी है तो बस इस प्रश्न की जाँच करें :


2
इस तरह की शर्म ngOnInitकी बात नहीं है :-( मैं वास्तव में कुछ पारदर्शी विलंबित आरंभीकरण जादू करना चाहता था। अगर ngOnDestroyकहा जा सकता है कि मैं यह नहीं देखता कि इनिट क्यों नहीं हो सकती
सिमोन_विवर

2

नोट: यह उत्तर केवल कोणीय घटकों और निर्देशों पर लागू होता है, सेवाओं पर नहीं।

मेरे पास यही मुद्दा था जब ngOnInit(और अन्य जीवन चक्र हुक) मेरे घटकों के लिए फायरिंग नहीं कर रहे थे, और अधिकांश खोजों ने मुझे यहां पहुंचाया।

मुद्दा यह है कि मैं तीर फ़ंक्शन सिंटैक्स ( =>) का उपयोग इस तरह कर रहा था :

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

स्पष्ट रूप से जो कोणीय 6 में काम नहीं करता है। नॉन-एरो फ़ंक्शन सिंटैक्स का उपयोग समस्या को ठीक करता है:

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

इंजेक्टेबल क्लासेस सर्विसेज हैं, कंपोनेंट्स नहीं। ओपी एक सेवा के बारे में पूछता है। हालाँकि आपका उत्तर POV भाषा से सही हो सकता है, लेकिन यह इस प्रश्न का उत्तर नहीं देता है। आपको इसे हटा देना चाहिए।
एंड्रयू फिलिप्स

@AndrewPhilips जबकि मेरा उपयोग मामला ओपी से थोड़ा अलग है, "ngOnInit not बुलाया" के लिए एक Google खोज यहां लोगों का नेतृत्व करती है। इस उत्तर के साथ मेरा लक्ष्य ओपी की मदद करना नहीं है, बल्कि अन्य 70,000+ दर्शकों की मदद करना है जिनके साथ समान मुद्दे हो सकते हैं ngOnInit
एजे रिचर्डसन

काफी उचित। मेरा मानना ​​है कि मैंने SO Q & A देखा है जिसमें एक लेखक पूछता है और फिर अपने प्रश्न का उत्तर देता है। एक नए कोणीय प्रोग्रामर के रूप में, आपके जवाब ने मुझे दो हफ्ते पहले भ्रमित किया होगा। एसओ और एनजी दोनों के नजरिए से, मुझे लगता है कि आपका जवाब अपने स्वयं के प्रश्न के योग्य है, इसलिए हटाए नहीं गए लेकिन "पुन: वर्गीकृत" किए गए। कौन जानता है? शायद यह एक व्यापक दर्शकों तक भी पहुंच सकता है। चीयर्स।
एंड्रयू फिलिप्स

1
समझ में आता है - मैंने अपने उत्तर को यह स्पष्ट करने के लिए संपादित किया कि यह सेवाओं के लिए नहीं है।
एजे रिचर्डसन

0

एक बार जब मेरे डेटासेवा को आरंभ किया गया था, तो मुझे एक फ़ंक्शन को कॉल करना था, इसके बजाय, मैंने इसे कंस्ट्रक्टर के अंदर बुलाया, जिसने मेरे लिए काम किया।


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()


}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.