ইনজেকটেবল ক্লাস ইনস্ট্যান্ট করা হলে এনজিওনাইট কল করা হবে না


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
@ লেভিফুলার হ্যাঁ, পরিষেবাগুলির জন্য আপনি কনস্ট্রাক্টরটিতে সূচনা করতে পারেন, বা আরও ভালভাবে ইনডিপ পদ্ধতি তৈরি করতে পারেন এবং কনস্ট্রাক্টর থেকে কল করতে পারেন (যদি আপনাকে পরে কোনও পরিষেবা পুনরায় সেট করতে হয় তবে)।
সাসকা

9
ঠিক নয়, অন-ইনিটকে বাঁধাইয়ের কাজ করতে হবে। আপনি যখন ইনপুট মানগুলি সমাধান হওয়ার অপেক্ষা করতে চান তখন আপনি এটি ব্যবহার করেন, কারণ সেগুলি কনস্ট্রাক্টরে উপলব্ধ নয়। কনস্ট্রাক্টরকে একাধিকবার বলা যেতে পারে। উদাহরণস্বরূপ, আপনি যখন রুট পরিবর্তন করেন এবং বিভিন্ন উপাদান লোড করেন তারা "নির্মিত" হয়ে যায় এবং প্রতিবার ধ্বংস হয়ে যায় ...
সাসেক্সা

5
এখানে আরও লক্ষণীয় যে সেভিসগুলিকে আপনি অ্যারেতে কোথায় অন্তর্ভুক্ত করবেন তার উপর নির্ভর করে একাধিকবার ইনস্ট্যান্টেশন করা যেতে পারে providers। যদি আপনি একটি সিঙ্গলটন পরিষেবা চান, এটি আপনার মূল মডিউলটির মধ্যে রাখুন providersএবং আপনি যদি প্রতি-উপাদানগুলির পরিষেবাগুলি চান তবে সেগুলি সরাসরি উপাদানটিতে যুক্ত করুন।
Askdesigners

4
এটি সম্পূর্ণরূপে ভুল নয়, কারণ তার উত্তরে @ এসবিডি ৫৮০ পয়েন্টকে ngOnDestroyইনজেকশনের পরিষেবার জন্য বলা হয়
শুসন

48

আমি সমস্ত জীবনচক্রের হুক সম্পর্কে জানি না, তবে ধ্বংস হিসাবে, ngOnDestroyপ্রকৃতপক্ষে যখন এটি সরবরাহকারীটি নষ্ট হয়ে যায় তখন ইনজেকটেবলের সাথে যোগাযোগ করুন (উদাহরণস্বরূপ কোনও উপাদান দ্বারা সরবরাহ করা ইনজেকটেবল)।

থেকে docs :

নির্দেশিকা, পাইপ বা পরিষেবা নষ্ট হয়ে গেলে লাইফাইসাইকেল হুক বলা হয়।

যদি কেউ ধ্বংসের বিষয়ে আগ্রহী তবে এই প্রশ্নটি পরীক্ষা করে দেখুন :


2
এ জাতীয় লজ্জা ngOnInitবলা হয় না :-( আমি সত্যিই কিছু স্বচ্ছ বিলম্বিত আরম্ভের যাদু করতে চেয়েছিলাম। যদি ngOnDestroyবলা যেতে পারে আমি কেন
দীক্ষা

2

দ্রষ্টব্য: এই উত্তরটি কেবল কৌণিক উপাদান এবং নির্দেশাবলীর জন্য প্রযোজ্য, পরিষেবা নয়।

আমার ngOnInitএবং এই একই সমস্যাটি ছিল যখন (এবং অন্যান্য জীবনচক্র হুকগুলি) আমার উপাদানগুলির জন্য গুলি চালাচ্ছিল না, এবং বেশিরভাগ অনুসন্ধানগুলি আমাকে এখানে নিয়ে যায়।

সমস্যাটি হ'ল আমি তীর ফাংশন সিনট্যাক্স ( =>) এর মতো ব্যবহার করছিলাম :

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

স্পষ্টতই এটি কৌণিক 6 এ কাজ করে না non তীরবিহীন ফাংশন সিনট্যাক্স ব্যবহার করা সমস্যার সমাধান করে:

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

ইনজেকশনযোগ্য ক্লাসগুলি পরিষেবাগুলি হয়, উপাদান নয়। ওপি একটি পরিষেবা সম্পর্কে জিজ্ঞাসা করে। যদিও আপনার উত্তরটি কোনও ভাষা POV থেকে সঠিক হতে পারে তবে এটি এই প্রশ্নের উত্তর দেয় না। আপনার এটি মুছে ফেলা উচিত।
অ্যান্ড্রু ফিলিপস

@ অ্যান্ড্রুফিলিপস যখন আমার ব্যবহারের ঘটনাটি ওপি'র থেকে কিছুটা আলাদা, সেখানে "এনজিওএনইনাইট নামে পরিচিত নয়" জন্য একটি গুগল অনুসন্ধান এখানে মানুষকে নিয়ে যায়। এই উত্তরটির সাথে আমার লক্ষ্য ওপিকে সহায়তা করা নয়, তবে অন্যান্য 70০,০০০+ দর্শকের মধ্যে যাদের একইরকম সমস্যা থাকতে পারে তাদের কাউকে সহায়তা করা ngOnInit
এজে রিচার্ডসন

যথেষ্ট ফর্সা। আমি বিশ্বাস করি যে আমি এসও প্রশ্নোত্তর দেখেছি যেখানে কোনও লেখক জিজ্ঞাসা করেন এবং তারপরে তাদের নিজের প্রশ্নের উত্তর দেন। নতুন কৌণিক প্রোগ্রামার হিসাবে, আপনার উত্তরটি আমাকে দুই সপ্তাহ আগে বিভ্রান্ত করবে। এসও এবং এনজি উভয় দৃষ্টিকোণ থেকে, আমি মনে করি যে আপনার উত্তরটি তার নিজের প্রশ্নের উপযুক্ত, সুতরাং মোছা হয়নি তবে "পুনরায় শ্রেণিবদ্ধ"। কে জানে? সম্ভবত এটি আরও বিস্তৃত দর্শকদের কাছে পৌঁছে যেতে পারে। চিয়ার্স।
অ্যান্ড্রু ফিলিপস

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


}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.