अपवाद: सभी मापदंडों को हल नहीं कर सकते


431

मैंने एंगुलर 2 में एक बेसिक ऐप बनाया है, लेकिन मुझे एक अजीब समस्या का सामना करना पड़ा है जहाँ मैं अपने किसी एक कंपोनेंट में सर्विस को इंजेक्ट नहीं कर सकता। हालाँकि यह मेरे द्वारा बनाए गए तीन अन्य घटकों में से किसी में भी ठीक है।

शुरुआत के लिए, यह सेवा है:

import { Injectable } from '@angular/core';

@Injectable()
export class MobileService {
  screenWidth: number;
  screenHeight: number;

  constructor() {
    this.screenWidth = window.outerWidth;
    this.screenHeight = window.outerHeight;

    window.addEventListener("resize", this.onWindowResize.bind(this) )
  }

  onWindowResize(ev: Event) {
    var win = (ev.currentTarget as Window);
    this.screenWidth = win.outerWidth;
    this.screenHeight = win.outerHeight;
  }

}

और इसके साथ काम करने से मना करने वाला घटक:

import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';

import {MobileService} from '../';

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(public ms: MobileService) {
    console.log(ms);
  }

}

ब्राउज़र कंसोल में मुझे जो त्रुटि मिलती है वह यह है:

अपवाद: HeaderComponent के लिए सभी मापदंडों को हल नहीं कर सकता: (?)।

मेरे पास बूटस्ट्रैप फ़ंक्शन में सेवा है इसलिए इसके पास एक प्रदाता है। और मुझे यह समस्या के बिना मेरे किसी भी अन्य घटक के निर्माता में इंजेक्ट करने में सक्षम लगता है।


14
शायद आयात? है '../'एक index.ts(बैरल)? क्या आप इसे उस फ़ाइल से आयात करने का प्रयास कर सकते हैं, जहाँ इसे इसके बजाय सीधे घोषित किया गया है?
गुंटर ज़ोचबॉयर

चमत्कारिक ढंग से यह तय हो गया लगता है! अजीब बात है कि यह बैरल का उपयोग करके काम नहीं करेगा जब मैंने अन्य घटकों के साथ सेवा का परीक्षण किया। यदि आप टिप्पणी के बजाय उत्तर के रूप में पोस्ट करना चाहते हैं तो मैं इसे स्वीकार करूंगा।
कीथ ओटो

11
आम तौर पर एक परिपत्र निर्भरता।
गैरी

मेरे पास यह समस्या परिपत्र निर्भरता के साथ भी है। यह ध्यान देने योग्य है कि वेब पैक के नए संस्करण आपको यह बताने में बहुत बेहतर हैं
एनएन

परिपत्र निर्भरता की तरह दिखता है, अगर आप कोणीय> = 4 का उपयोग करते हैं तो आप intex.ts (बैरल) से छुटकारा पा सकते हैं और सभी को सीधे आयात कर सकते हैं।
राममगरोट

जवाबों:


457

इसे उस फ़ाइल से आयात करें जहां इसे बैरल के बजाय सीधे घोषित किया गया है।

मुझे नहीं पता कि वास्तव में इस मुद्दे का क्या कारण है, लेकिन मैंने इसे कई बार (शायद किसी प्रकार की परिपत्र निर्भरता) उल्लेख किया है।

बैरल में निर्यात के क्रम को बदलकर इसे भी ठीक किया जाना चाहिए (विवरण नहीं पता, लेकिन साथ ही उल्लेख किया गया था)


16
यदि आप उदाहरण के लिए किसी अन्य सेवा में इंजेक्ट की गई सेवा को पहले बैरल में पहले आने की आवश्यकता है तो यह सही है।
जोआओ गारिन

17
Angular2 टीम ऐसे बहुत सारे मुद्दों के कारण बैरल की सिफारिश नहीं करती है। सुनकर खुशी हुई कि मैं मदद कर सकता हूं :)
गुंटर ज़ोचौएर

13
पता नहीं था कि कोणीय 2 टीम बैरल की सिफारिश नहीं करती है। यदि हां, तो उन्हें इस बात पर ध्यान देना चाहिए कि उनके लाभ पर चर्चा करने वाली शब्दावली में । और कोणीय 2-वेबपैक-स्टार्टर जैसी परियोजनाओं का उपयोग नहीं करना चाहिए।
ब्लू

3
यह तय हो गया (यह एक मुद्दा नहीं है 2.0.2)। मुझे बैरल अभी भी उपयोगी लगते हैं, खासकर जब मुझे विभिन्न मॉडलों के बीच कई मॉडल और सेवाओं को आयात करने की आवश्यकता होती है। यह import { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';एक दर्द था जब यह काम नहीं करता था (, NgModuleसिंगलटन सेवाओं से कोई मदद नहीं मिली ...
सक्सा

3
Argghh I ने इसे बैरल (index.ts) फ़ाइल में निर्यात के क्रम को बदलकर हल किया .. बहुत बहुत धन्यवाद
Spock

331

दिए गए पिछले उत्तरों के अलावा, ऐसा लगता है कि यह त्रुटि तब डाली गई है जब आपकी इंजेक्टेबल सेवा वास्तविक @Injectable()डेकोरेटर को याद कर रही है । तो इससे पहले कि आप चक्रीय निर्भरता बात और अपने आयात / निर्यात के क्रम को डिबग करें, एक साधारण जांच करें कि क्या आपकी सेवा वास्तव में @Injectable()परिभाषित है।

यह वर्तमान कोणीय नवीनतम, कोणीय 2.1.0 पर लागू होता है।

मैंने इस मामले पर एक मुद्दा खोला


हाँ यह त्रुटि आम तौर पर इसलिए है क्योंकि आप @Injectable को जोड़ना भूल गए हैं और उदाहरण के लिए आप केवल Router'@ कोणीय / राउटर' से आयात कर रहे हैं और उस इंजेक्शन के बिना, यह त्रुटि हमेशा होगी (जैसे ही आप एक पंक्ति बनाने का निर्णय लेते हैं कोड उस इंजेक्टेड राउटर का उपयोग करता है।
एरिक बिशर्ड

बहुत बढ़िया जवाब, मेरा मुद्दा यह था कि मैंने अपनी सेवा में एक विधि जोड़ी और अंतिम ब्रेस के बाद एक अर्ध उपनिवेश नहीं जोड़ा। मुझे नहीं पता कि यह इस तरह से क्यों है, अभी तक घटक वर्गों में ऐसा नहीं है ... अभी के लिए केवल आगे बढ़ने की खुशी है!
एगिमेबेन

मेरे पास एक सरल मॉडल था जिसने मुझे यह त्रुटि दी। मैंने उस शॉर्टकट का उपयोग किया जहां आप मॉडल के कंस्ट्रक्टर में अपनी संपत्ति बनाते हैं। गुणों के प्रकार केवल स्ट्रिंग और इंट थे। फिर अचानक यह मुद्दा होने लगा। @Injectable () को जोड़ने से समस्या ठीक हो गई। अजीब क्योंकि मेरे किसी अन्य मॉडल में इंजेक्टेबल जोड़ा नहीं गया है। मुझे यह जोड़ना है कि मैंने इस नए मॉडल को जोड़ने से पहले काफी कुछ पुस्तकालयों को अपग्रेड किया है। संभवतः इसके साथ कुछ करना था, लेकिन अब काम कर रहा है। धन्यवाद।
मुटनो

@Moutono सही। आपकी सेवा में एक खाली कंस्ट्रक्टर के साथ, निर्भरता इंजेक्शन ट्रिगर नहीं लगता है और @injectable()इसकी आवश्यकता नहीं है। जो अपने आप में एक और विषमता है। अच्छे उपाय के लिए मैं इसे अभी भी जोड़ूंगा, बस जब आप कभी भी कुछ इंजेक्ट करने का निर्णय लेना चाहिए।
जेपी दस बर्ज

इस बात को ध्यान में रखें कि यदि आपकी सेवा में एक आधार वर्ग है जिसे भी @Injectable () के साथ सजाया जाना है
सैम शिल्स

110

कोणीय के रूप में 2.2.3अब एक forwardRef()उपयोगिता फ़ंक्शन है जो आपको उन प्रदाताओं को इंजेक्ट करने की अनुमति देता है जिन्हें अभी तक परिभाषित नहीं किया गया है।

परिभाषित नहीं होने से मेरा मतलब है कि निर्भरता इंजेक्शन मानचित्र पहचानकर्ता को नहीं जानता है। परिपत्र निर्भरता के दौरान यही होता है। आप कोणीय में परिपत्र निर्भरताएं हो सकती हैं जो कि अनसंग करना और देखना बहुत कठिन हैं।

export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(@Inject(forwardRef(() => MobileService)) public ms: MobileService) {
    console.log(ms);
  }

}

@Inject(forwardRef(() => MobileService))मूल प्रश्न के स्रोत कोड में कंस्ट्रक्टर के पैरामीटर को जोड़ने से समस्या ठीक हो जाएगी।

संदर्भ

कोणीय 2 मैनुअल: फारवर्डरफ

कोणीय 2 में आगे के संदर्भ


3
forwardRef()अल्फा में पहले से ही था ;-) यह केवल तभी आवश्यक है जब Mobileसेवा को उसी फ़ाइल में और नीचे घोषित किया जाए। यदि कक्षाएं अलग-अलग फ़ाइलों में हैं, तो इसके लिए कोई ज़रूरत नहीं हैforwardRef()
गुंटर ज़ोचौएर

4
गुंटर ज़ोचाउर, मैं अभी भी अपने कोड के साथ वास्तविक समस्या का पता लगाने की कोशिश कर रहा हूं, लेकिन इस बीच संदेश से forwardRef()छुटकारा पाने में मदद की Can't resolve all parameters for ...। कम से कम घटक काम कर रहा है जबकि मैं समस्या के अच्छे समाधान की तलाश में हूं। (और हां, असफलता निर्भरता सीधे इसकी फ़ाइल से आयात की जाती है)
निक

4
@ GünterZöchbauer मैंने संदर्भों के साथ अपना उत्तर अपडेट कर दिया है। मैं आपके उत्तर से दूर जाने की कोशिश नहीं कर रहा हूं, लेकिन यह वास्तव में समस्या को हल करता है और लोगों को इसके बारे में जानने की जरूरत है। यदि आप सवाल पूछते हैं कि कोई परिणाम नहीं हैं जो उपयोग करने के लिए कहते हैं forwardRef। इसे खोजना बहुत कठिन है। इस समस्या के समाधान के लिए कल मुझे पूरा दिन लगा।
रिएक्टगुलर

अजीब। मैंने कम से कम एक दर्जन उत्तर पोस्ट किए हैं जो foreardRefखुद का उपयोग करने का सुझाव देते हैं लेकिन अब NgModuleपेश किए जाने के बाद नहीं । मैं हारने वाले प्रतिनिधि के बारे में चिंतित नहीं हूं। मैं उत्सुक हूँ कि आप इसमें क्यों भाग लेते हैं क्योंकि यह कुछ महीनों से अब तक नहीं हुआ है। जब मैं कुछ दिनों में घर वापस आऊँगा, तब मेरी नज़दीकी नज़र होगी। प्रतिक्रिया के लिए बहुत बहुत धन्यवाद।
गुंटर ज़ोचबॉयर

2
यदि किसी को आयात के बारे में भी पता चला है: आयात {Component, Inject, ForwardRefFn, ForwardRef} को '@ कोणीय / कोर' से;
Natanael

69

गलत # 1: भूल गया डेकोरेटर:

//Uncaught Error: Can't resolve all parameters for MyFooService: (?).
export class MyFooService { ... }

गलत # 2: "@" प्रतीक स्वीकार करना:

//Uncaught Error: Can't resolve all parameters for MyFooService: (?).
Injectable()
export class MyFooService { ... }

गलत # 3: स्वीकार करना "()" प्रतीक:

//Uncaught Error: Can't resolve all parameters for TypeDecorator: (?).
@Injectable
export class MyFooService { ... }

गलत # 4: लोअरकेस "मैं":

//Uncaught ReferenceError: injectable is not defined
@injectable
export class MyFooService { ... }

गलत # 5: आप भूल गए: '@ कोणीय / कोर' से {इंजेक्टेबल} आयात करें;

//Uncaught ReferenceError: Injectable is not defined
@Injectable
export class MyFooService { ... }

सही बात:

@Injectable()
export class MyFooService { ... }

27

जैसा कि पहले ही कहा गया है, यह मुद्दा बैरल के भीतर निर्यात आदेश के कारण होता है जो परिपत्र निर्भरता के कारण होता है।

अधिक विस्तृत विवरण यहां है: https://stackoverflow.com/a/37907696/893630


3
आदेश देने से मेरी समस्या हल नहीं हुई। बैरल का उपयोग नहीं किया।
माइकल लाफार्ग

21

मुझे सेवा ए में सेवा बी और इसके विपरीत इंजेक्शन लगाने से भी इसका सामना करना पड़ा।

मुझे लगता है कि यह अच्छी बात है कि यह तेजी से विफल होता है क्योंकि इसे शायद वैसे भी टाला जाना चाहिए । यदि आप चाहते हैं कि आपकी सेवाएं अधिक से अधिक मॉड्यूलर और पुन: प्रयोज्य हों, तो यथासंभव सर्कुलर संदर्भों से बचना सर्वोत्तम है। इस पोस्ट में आसपास के नुकसान पर प्रकाश डाला गया है।

इसलिए, मेरी निम्नलिखित सिफारिशें हैं:

  • यदि आपको लगता है कि कक्षाएं बहुत बार बातचीत कर रही हैं (मैं फीचर ईर्ष्या के बारे में बात कर रहा हूं ), तो आप 2 सेवाओं को 1 कक्षा में विलय करने पर विचार कर सकते हैं ।
  • यदि उपरोक्त आपके लिए काम नहीं करता है, तो एक 3 सेवा का उपयोग करने पर विचार करें , ( ए EventService) जो संदेशों को आदान-प्रदान करने के लिए दोनों सेवाओं को इंजेक्ट कर सकते हैं।

1
यह निश्चित रूप से मेरे साथ हुआ है, और यह जाने का रास्ता है। यदि आप जानते हैं कि आपके पास अपडेट की आवश्यकता वाली एक से अधिक सेवाएँ हैं, तो EventService का उपयोग करें। यह अधिक एक्स्टेंसिबल है क्योंकि आपको इन घटनाओं में कोई संदेह नहीं है क्योंकि आप इन घटनाओं के आधार पर एप्लिकेशन का विस्तार करते हैं।
थीमाइटबुन

17

खोजकर्ताओं के लाभ के लिए; मुझे यह त्रुटि मिली। यह केवल एक लापता @ प्रतीक था।

यानी यह Can't resolve all parameters for MyHttpServiceत्रुटि पैदा करता है ।

Injectable()
export class MyHttpService{
}

लापता @प्रतीक जोड़ना इसे ठीक करता है।

@Injectable()
export class MyHttpService{
}

2
मेरे मामले में, मैंने @Injectable और सर्विस क्लास की परिभाषा के बीच अतिरिक्त कक्षाएं और इंटरफेस जोड़े हैं, इसलिए सर्विस क्लास को अब इंजेक्शन के रूप में चिह्नित नहीं किया गया था।
हरक

यदि आप पूरी तरह से अन्य इंजेक्शन योग्य सेवाओं का उपभोग करने वाले सेवा वर्ग पर @Injectable () डेकोरेटर को भूल जाते हैं, तो आपकी अनुचित तरीके से सजाई गई सेवा भी इस त्रुटि को फेंक देगी।
बुकान

10

मेरे मामले में, मुझे काम import "core-js/es7/reflect";करने के लिए अपने आवेदन में जोड़ना होगा @Injectable


9

एक और संभावना emitDecoratorMetadatatsconfig.json में सच होने के लिए निर्धारित नहीं है

{
  "compilerOptions": {

     ...

    "emitDecoratorMetadata": true,

     ...

    }

}

8

आपको यह त्रुटि मिलती है यदि आपके पास सेवा ए है जो कि स्थिर संपत्ति / सेवा बी की विधि पर निर्भर करती है और सेवा बी स्वयं सेवा ट्राउट निर्भरता इंजेक्शन पर निर्भर करती है । तो यह एक तरह की परिपत्र निर्भरता है, हालांकि यह तब से नहीं है जब संपत्ति / विधि स्थिर है। संभवतः एक बग जो एओटी के साथ संयोजन में होता है ।


मैंने भी इसे तब किया है जब एक ही फाइल में परिभाषित फ़ंक्शन पर निर्भरता है। एक अलग फ़ाइल में विभाजित करके इसे ठीक कर दिया।
जो

1
इसका उल्लेख करने के लिए धन्यवाद। मैंने खुद को सटीक स्थिति में पाया है। मुझे महसूस नहीं हुआ कि सीधे स्टेटिक क्लासेस को एक्सेस करने से डीआई को कुछ हो सकता है। मेरे पास यह योजना थी: A -> Bऔर वे दोनों एक ही स्थिर वर्ग का उपयोग कर रहे थे। के साथ समाधान में forwardRefमदद करता है, लेकिन मैं यह देखने के लिए जा रहा हूं कि यह कैसे असंगत हो सकता है। मैं शायद इस स्टैटिक क्लास से बाहर एक वास्तविक सेवा करने की कोशिश करूँगा (यह एक बेहतर डिज़ाइन के साथ-साथ आगे बढ़ेगा)।
स्लाव फोमिन II

8

लापता @Injectable()डेकोरेटर के अलावा

@Injectable()सार वर्ग में लापता सज्जाकार ने सेवा के लिए सभी मापदंडों को हल नहीं किया: (?) सजावटकर्ता को वर्तमान MyServiceवर्ग में भी मौजूद होना चाहिए।BaseService

//abstract class
@Injectable()
abstract class BaseService { ... }

//MyService    
@Injectable()
export class MyService extends BaseService {
.....
}

7

मेरे मामले में, यह इसलिए हुआ क्योंकि मैंने एक निर्माता पैरामीटर के लिए प्रकार घोषित नहीं किया था।

मेरे पास कुछ ऐसा था:

constructor(private URL, private http: Http) { }

और फिर इसे नीचे दिए गए कोड में बदलकर मेरी समस्या हल कर दी।

constructor(private URL : string, private http: Http) {}

5

मेरे लिए यह सिर्फ ()@ Injectable की कमी थी । उचित है @ इंजेक्शन ()


या मेरे मामले में गलती से @ को हटाने
तेदेपा

4

इंजेक्टेबल कंस्ट्रक्टर () विधि से मापदंडों को हटाकर इसे मेरे मामले के लिए हल किया गया।


ठीक यही समस्या मेरी भी थी। मैं इसे पोस्ट करने के लिए आया था, लेकिन पाया कि आपने पहले किया था! +1
aesede

फिर पुन: प्रयोज्य सेवा के लिए पैरामीटर कैसे भेजें?
3Gwebtrain

4

मेरे मामले में यह प्लगइन Augury के कारण था, अक्षम करें यह ठीक काम करेगा। वैकल्पिक विकल्प aot है, काम भी करता है।

@ Boboss74 को सभी क्रेडिट, उन्होंने यहां उत्तर पोस्ट किया: https://github.com/angular/angular/issues/23958


2

खैर मेरे लिए यह मुद्दा और भी अधिक कष्टप्रद था, मैं एक सेवा के भीतर एक सेवा का उपयोग कर रहा था और इसे appModule में निर्भरता के रूप में जोड़ना भूल गया था! आशा है कि यह किसी को ऐप को तोड़ने के लिए कई बार बचाने में मदद करता है ताकि इसे फिर से बनाया जा सके


1
मुझे सिर्फ एक @Injectएनोटेशन याद आ रहा था । मैं ठीक-ठीक देख रहा था कि त्रुटि संदेश क्या कहता है। यदि आपको परिपत्र निर्भरता पर संदेह नहीं है, तो बस त्रुटि में बताए गए वर्ग पर जाएं और सभी निर्माण मापदंडों को देखें और किसी भी वर्ग के सदस्यों के साथ एनोटेट करें @Injectऔर सुनिश्चित करें कि आप उन सभी पर डीआई कर रहे हैं। DI पर यहाँ और अधिक: angular.io/docs/ts/latest/guide/d dependency
अलेक्जेंडर टेलर

2

आपको @Component डेकोरेटर या उस मॉड्यूल में प्रदाता सरणी को जोड़ना होगा जहां आपका घटक घोषित किया गया है। घटक के अंदर आप नीचे के रूप में कर सकते हैं:

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
  providers: [MobileService]
})

2

मेरे मामले में कंस्ट्रक्टर के लिए गलत पैरामीटर पास करने से यह त्रुटि उत्पन्न होती है, इस त्रुटि के बारे में मूल विचार यह है कि आपने अनजाने में किसी फ़ंक्शन को कुछ गलत तरीके से पारित किया है।

export class ProductComponent {
    productList: Array<Product>;

    constructor(productList:Product) { 
         // productList:Product this arg was causing error of unresolved parameters.
         this.productList = [];
    }
}

मैंने उस तर्क को हटाकर इसे हल किया।


2

मेरे लिए, मुझे यह त्रुटि तब हुई जब मैंने गलती से इस आयात को पॉलीफ़िल्स .ts फ़ाइल में अक्षम कर दिया, आपको यह सुनिश्चित करने की आवश्यकता है कि उस त्रुटि से बचने के लिए इसे आयात किया जाए।

/** Evergreen browsers require these. **/
// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
import 'core-js/es7/reflect';

2

मेरे मामले में मैं NativeDateAdapterओवरराइड करने के लिए " " विस्तार करने की कोशिश कर रहा थाformat(date: Date, displayFormat: Object) " विधि ।

AngularMaterial-2 DatePicker में।

इसलिए मूल रूप से मैं @Injectableएनोटेशन जोड़ना भूल गया ।

अपने "CustomDateAdapter" वर्ग में इसे जोड़ने के बाद:

@Injectable({
  providedIn: 'root'
})

त्रुटि हो गई है।


इसने मेरे लिए काम किया, लेकिन मुझे पता नहीं क्यों। क्या डीआई के माध्यम से प्राप्त होने वाली सेवा और घटक दोनों को प्रदान करने की आवश्यकता है: डीआई को काम करने के लिए रूट?
15:25 पर माइक फेलेंडर जूल

2

इस समस्या के लिए यह उत्तर बहुत मददगार हो सकता है। इसके अलावा, मेरे मामले के लिए, defaultकारण के रूप में सेवा का निर्यात करना था।

गलत:

@Inject()
export default class MobileService { ... }

सही बात:

@Inject()
export class MobileService { ... }

2

यह त्रुटि में प्रतिक्रिया की कमी के कारण डिबग करने के लिए वास्तव में मुश्किल मुद्दा हो सकता है। यदि आप एक वास्तविक चक्रीय निर्भरता के बारे में चिंतित हैं, तो स्टैक ट्रेस में देखने के लिए सबसे महत्वपूर्ण बात यह है कि a) सेवा का नाम b) उस सेवा में कंस्ट्रक्टर पैरामीटर जिसमें प्रश्न चिह्न है जैसे यदि यह इस तरह दिखता है:

AuthService के लिए सभी मापदंडों को हल नहीं कर सकते हैं: ([वस्तु वस्तु], [वस्तु वस्तु], [वस्तु वस्तु], [वस्तु वस्तु];)

तो इसका मतलब है कि 5 वाँ पैरामीटर एक ऐसी सेवा है जो AuthService पर भी निर्भर है। यानी प्रश्नचिह्न, इसका मतलब है कि यह DI द्वारा हल नहीं किया गया था।

वहां से, आपको बस कोड को पुनर्गठन करके 2 सेवाओं को अपघटित करने की आवश्यकता है।


1

मुझे सेवा के नाम यानी कंस्ट्रक्टर (निजी myService: MyService ) को गलत बताकर इस त्रुटि का सामना करना पड़ा है ।

गलत वर्तनी वाली सेवाओं के लिए, मैं क्रोम-> कंसोल में पेज का निरीक्षण करके यह निर्धारित करने में सक्षम था कि कौन सी सेवा में समस्या थी (मैंने कंस्ट्रक्टर में कई सूचीबद्ध थे)। आप ऑब्जेक्ट ऑब्जेक्ट, ऑब्जेक्ट ऑब्जेक्ट प्रदर्शित करके संदेश के "पैरामीटर" सरणी सूची के भाग के रूप में देखेंगे? (या कुछ इस तरह का)। नोटिस कहाँ "?" वह है और यह उस सेवा की स्थिति है जो समस्या पैदा कर रही है।


1

हालांकि आदेश बैरल के भीतर से निर्यात वर्गों का उल्लेख किया गया है, निम्नलिखित परिदृश्य भी एक ही प्रभाव पैदा कर सकता है।

मान लीजिए कि आपके पास कक्षाएं हैं A, Bऔर Cउसी फ़ाइल के भीतर से निर्यात किया जाता है जहां Aपर निर्भर करता है Bऔर C:

@Injectable()
export class A {
    /** dependencies injected */
    constructor(private b: B, private c: C) {}
}

@Injectable()
export class B {...}

@Injectable()
export class C {...}

चूंकि आश्रित वर्ग (यानी इस मामले में कक्षाएं ) Bऔर Cअभी तक कोणीय को नहीं जानते हैं, ( शायद कक्षा पर अंगुल की निर्भरता इंजेक्शन प्रक्रिया के दौरान रन-टाइम परA ) त्रुटि उठाई जाती है।

समाधान

समाधान यह है कि डीआई किए जाने वाले वर्ग से पहले आश्रित कक्षाओं को घोषित और निर्यात करें।

उपरोक्त मामले में Aइसकी निर्भरता परिभाषित होने के बाद कक्षा को सही घोषित किया जाता है:

@Injectable()
export class B {...}

@Injectable()
export class C {...}

@Injectable()
export class A {
    /** dependencies injected */
    constructor(private b: B, private c: C) {}
}

1

मेरे मामले में, मैं उसी घटक फ़ाइल से एक वर्ग और एक Enum निर्यात कर रहा था:

mComponent.component.ts:

export class MyComponentClass{...}
export enum MyEnum{...}

फिर, मैं के MyEnumएक बच्चे से उपयोग करने की कोशिश कर रहा था MyComponentClass। यह सभी पैरामीटर त्रुटि को हल नहीं कर सकता था ।

से MyEnumएक अलग फ़ोल्डर में ले जाकर MyComponentClass, कि मेरी समस्या हल हो गई!

जैसा कि गुंटर ज़ोचबॉयर ने उल्लेख किया है, यह एक सेवा या घटक के कारण परिपत्र रूप से निर्भर होने के कारण हो रहा है।


1

यदि आपकी सेवा को एक घटक के रूप में एक ही फ़ाइल में परिभाषित किया गया है (जो इसे खपत करता है) और सेवा को बाद में परिभाषित किया गया है उस फ़ाइल में घटक के जो आपको यह त्रुटि मिल सकती है। यह उसी 'फॉरवर्ड रीफ' मुद्दे के कारण है जिसका दूसरों ने उल्लेख किया है। इस समय VSCode आपको यह त्रुटि दिखाने के बारे में महान नहीं है और बिल्ड सफलतापूर्वक संकलित करता है।

के साथ निर्माण चल रहा है --aotकंपाइलर के काम करने के तरीके (संभवत: पेड़ के हिलने से संबंधित) के कारण इस समस्या का सामना कर सकती है।

समाधान: सुनिश्चित करें कि सेवा किसी अन्य फ़ाइल में या घटक परिभाषा से पहले परिभाषित की गई है। (मुझे यकीन नहीं है कि अगर फॉरवर्ड का इस्तेमाल इस मामले में किया जा सकता है, लेकिन ऐसा करना अनाड़ी लगता है)।

यदि मेरे पास एक बहुत ही सरल सेवा है जो बहुत दृढ़ता से एक घटक (एक दृश्य मॉडल की तरह) से जुड़ी है - जैसे। ImageCarouselComponent, मैं इसे नाम दे सकता हूं ImageCarouselComponent.service.tsताकि यह मेरी अन्य सेवाओं के साथ मिश्रित न हो।


1

मेरे मामले में यह एक परिपत्र संदर्भ था। मेरे पास MyService कॉलिंग MyService2 और MyService2 कॉलिंग MyService थी।

अच्छा नही :(


1

मेरे मामले में, कारण निम्नलिखित था:

  • मेरी इंजेक्टेबल सेवा ए ने एक अन्य वर्ग बी बढ़ाया
  • B के पास एक कंस्ट्रक्टर था जिसे एक तर्क की आवश्यकता थी
  • मैंने ए में किसी भी निर्माता को परिभाषित नहीं किया था

परिणामस्वरूप, जब कोई ऑब्जेक्ट A बनाने का प्रयास किया जाता है, तो डिफ़ॉल्ट निर्माता विफल हो जाता है। मुझे नहीं पता कि यह एक संकलन त्रुटि क्यों नहीं थी।

मैंने इसे ए में केवल एक कंस्ट्रक्टर जोड़कर तय किया, जिसे बी का कंस्ट्रक्टर सही कहा जाता है।


1

पकड़ लिया!

यदि उपरोक्त उत्तर में से कोई भी आपकी मदद नहीं करता है, तो शायद आप उसी फ़ाइल से कुछ तत्व आयात कर रहे हैं जहां एक घटक सेवा को इंजेक्ट कर रहा है।

मैं बेहतर समझाता हूं:

यह सेवा फ़ाइल है :

// your-service-file.ts
import { helloWorld } from 'your-component-file.ts'

@Injectable()
export class CustomService() {
  helloWorld()
}

यह घटक फ़ाइल है :

@Component({..})
export class CustomComponent {
  constructor(service: CustomService) { }
}

export function helloWorld() {
  console.log('hello world');
}

तो यह समस्याओं का कारण बनता है भले ही प्रतीक एक ही घटक के अंदर न हो, लेकिन सिर्फ उसी फ़ाइल के अंदर। प्रतीक को स्थानांतरित करें (यह एक फ़ंक्शन, एक स्थिर, एक वर्ग और इसी तरह ...) कहीं और हो सकता है और त्रुटि दूर हो जाएगी


1

कोणीय 6 और नए संस्करणों के लिए, प्रयास करें

@Injectable({
  providedIn: 'root'
})

.. अपने सेवा वर्ग के ठीक ऊपर बीच में कोई अन्य रेखाएँ नहीं है

फायदे

  • किसी भी मॉड्यूल में सेवा को जोड़ने की आवश्यकता नहीं है ("ऑटो-खोजा जाएगा")
  • सेवा एक सिंगलटन होगी (क्योंकि इसे रूट में इंजेक्ट किया जाएगा)

[ कोणीय डॉक्स ]

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