ছাড়: সমস্ত পরামিতি সমাধান করতে পারে না


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

}

ব্রাউজার কনসোলে আমি যে ত্রুটিটি পাই তা হ'ল:

ছাড়: শিরোনাম কম্পোনেন্টের জন্য সমস্ত পরামিতিগুলি সমাধান করতে পারে না: (?)।

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


14
আমদানি হতে পারে? কি '../'একটি index.ts(ব্যারেল)? আপনি যে ফাইলটি এটির পরিবর্তে সরাসরি ঘোষণা করা হয়েছে সেখান থেকে আমদানির চেষ্টা করতে পারেন?
গন্টার জ্যাচবাউয়ার

অলৌকিকভাবে মনে হয় এটি স্থির করে দিয়েছে! অদ্ভুত যে ব্যারেলটি ব্যবহার করে কাজ করবে না যখন অন্যান্য উপাদানগুলির সাথে আমি পরিষেবাটি পরীক্ষা করেছি। আপনি যদি মন্তব্যটির পরিবর্তে উত্তর হিসাবে পোস্ট করতে চান তবে আমি তা গ্রহণ করব।
কিথ অটো

11
সাধারণত একটি বিজ্ঞপ্তি নির্ভরতা।
গ্যারি

আমিও বিজ্ঞপ্তি নির্ভরতা সহ এই সমস্যা ছিল। এটি গুরুত্বপূর্ণ যে ওয়েব প্যাকের নতুন সংস্করণগুলি আপনাকে এটি বলার চেয়ে আরও ভাল
Enn

বিজ্ঞপ্তি নির্ভরতা বলে মনে হচ্ছে, যদি আপনি কৌনিক> = 4 ব্যবহার করেন তবে আপনি ইন্টেক্স.টস (ব্যারেল) থেকে মুক্তি পেতে পারেন এবং আপনার যা প্রয়োজন তা সরাসরি আমদানি করতে পারেন।
রাম্মারোট

উত্তর:


457

এটি ব্যারেলের পরিবর্তে সরাসরি ঘোষিত ফাইল থেকে এটি আমদানি করুন।

সমস্যাটি কী কারণে ঘটেছিল তা আমি জানি না তবে আমি এটি বেশ কয়েকবার উল্লেখ করেছি (সম্ভবত কোনওরকম বিজ্ঞপ্তি নির্ভরতা)।

ব্যারেলের রফতানির ক্রম পরিবর্তন করে এটি স্থিরযোগ্যও হওয়া উচিত (বিশদটি জানেন না তবে পাশাপাশি উল্লেখ করা হয়েছিল)


16
এটি সঠিক যদি আপনার উদাহরণস্বরূপ কোনও পরিষেবা অন্য কোনও পরিষেবাতে ইনজেকশনের থাকে যা প্রথমে ব্যারেলটিতে প্রথমে আসা দরকার।
জোওও গ্যারিন

17
অ্যাঙ্গুলার 2 টি এই জাতীয় অনেক সমস্যার কারণে আর ব্যারেল সুপারিশ করে না। শুনে আমি
খুশী হলাম

13
জানতেন না যে কৌণিক 2 টি দল ব্যারেলের প্রস্তাব দেয় না। যদি তা হয় তবে তাদের লক্ষ্য করা উচিত যে শব্দকোষে তাদের উপকার নিয়ে আলোচনা করা হয়েছে। এবং কৌণিক 2-ওয়েবপ্যাক-স্টার্টারের মতো প্রকল্পগুলি তাদের ব্যবহার করা উচিত নয়।
নীল

3
এটি seams এটি স্থির ছিল (কোনও সমস্যা নয় 2.0.2)। আমি ব্যারেলগুলি এখনও দরকারী মনে করি, বিশেষত যখন আমার বিভিন্ন মডিউলগুলির মধ্যে বেশ কয়েকটি মডেল এবং পরিষেবা আমদানি করতে হয়। এই import { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';ব্যাথা যখন এটি কাজ (না ছিল; NgModuleSingleton পরিষেবার সঙ্গে কোন সাহায্যের হচ্ছে ...
Sasxa

3
আরগ আমি ব্যারেল (index.ts) ফাইলে রফতানির ক্রম পরিবর্তন করে এটি সমাধান করেছি .. আপনাকে অনেক ধন্যবাদ
স্পোক

331

প্রদত্ত পূর্ববর্তী উত্তরগুলি ছাড়াও, যখন আপনার ইনজেকশনযোগ্য পরিষেবাটি প্রকৃত @Injectable()সাজসজ্জা হারিয়েছে তখন মনে হয় এই ত্রুটিটিও ছোঁড়া হয়েছে । সুতরাং আপনি চক্রীয় নির্ভরতা জিনিসটি এবং আপনার আমদানি / রফতানির ক্রমটি ডিবাগ করার আগে আপনার পরিষেবাটি আসলে @Injectable()সংজ্ঞায়িত করেছে কিনা তা একটি সাধারণ পরীক্ষা করে দেখুন ।

এটি বর্তমান কৌনিক সর্বশেষ, কৌণিক 2.1.0 এ প্রযোজ্য।

আমি এই বিষয়ে একটি ইস্যু খোলে


হ্যাঁ এই ত্রুটিটি সাধারণত কারণ আপনি Router@ ইনজেক্টেবল যুক্ত করতে ভুলে গিয়েছেন এবং উদাহরণস্বরূপ আপনি কেবল '@ কৌনিক / রাউটার' থেকে আমদানি করতে পারেন এবং সেই ইনজেক্টেবল ছাড়াই এই ত্রুটিটি সর্বদা ঘটবে (আপনি যখনই একটি লাইন তৈরি করার সিদ্ধান্ত নেওয়ার সাথে সাথেই থাকবেন কোড ব্যবহার রাউটার ইনজেকশনের পারে।
এরিক Bishard

দুর্দান্ত উত্তর, আমার সমস্যাটি হ'ল আমি আমার পরিষেবায় একটি পদ্ধতি যুক্ত করেছি এবং চূড়ান্ত ধনুর্বন্ধনী পরে কোনও আধা কোলন যোগ করি নি। কেন এই উপায় হতে হবে তা আমার কোনও ধারণা নেই তবুও এটি উপাদান উপাদানগুলির ক্ষেত্রে হয় না ... আপাতত কেবল এগিয়ে যেতে পেরে আমি আনন্দিত!
egimaben

আমার একটি সাধারণ মডেল ছিল যা আমাকে এই ত্রুটি দিয়েছে। আমি শর্টকাটটি ব্যবহার করেছি যেখানে আপনি মডেলটির নির্মাতায় আপনার সম্পত্তি তৈরি করেন। বৈশিষ্ট্যের ধরণগুলি কেবল স্ট্রিং এবং ইন্টি ছিল। তারপরে হঠাৎ এই সমস্যাটি শুরু হয়েছিল। @ ইনজেক্টেবল () যুক্ত করা সমস্যার সমাধান করেছে। অদ্ভুত কারণ আমার অন্য কোনও মডেলের ইনজেকটেবল যোগ হয়নি। আমাকে যুক্ত করতে হবে যে আমি এই নতুন মডেলটি যুক্ত করার আগে বেশ কয়েকটি গ্রন্থাগার আপগ্রেড করেছি। সম্ভবত এটির সাথে কিছু করার ছিল তবে এখন কাজ করছে। ধন্যবাদ।
মাটনোন 18

পছন্দ করুন আপনার পরিষেবাতে একটি খালি নির্মাণকারীর সাথে, নির্ভরতা ইঞ্জেকশনটি ট্রিগার হয়ে উঠবে বলে মনে @injectable()হয় না এবং এটির প্রয়োজন হয় না। যা নিজেই অন্য একটি বিজোড়তা। ভাল পরিমাপের জন্য আমি এখনও এটিকে যুক্ত করব, কেবল কখন আপনার যখন কোনও কিছু ইনজেক্ট করার সিদ্ধান্ত নেওয়া উচিত।
জেপি দশ বার্গে 16

মনে রাখবেন যে যদি আপনার পরিষেবার একটি বেস ক্লাস থাকে তবে এটিও @ ইনজেক্টেবল () দিয়ে সজ্জিত করা দরকার
স্যাম শাইলস

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পরিষেবা কেবল একই ফাইলটিতে আরও ঘোষণা করা হলে এটি কেবল প্রয়োজন needed ক্লাসগুলি যদি বিভিন্ন ফাইলে থাকে তবে কোনও প্রয়োজন নেইforwardRef()
গন্টার জ্যাচবাউয়ার

4
গন্টার জ্যাচবাউয়ার, আমি এখনও আমার কোড সহ আসল সমস্যাটি সনাক্ত করার চেষ্টা করছি, কিন্তু forwardRef()এর মধ্যে Can't resolve all parameters for ...বার্তাটি থেকে মুক্তি পেতে সহায়তা করেছিলাম । আমি সমস্যার একটি উত্তম সমাধান সন্ধান করতে গিয়ে কমপক্ষে উপাদানটি কাজ করছে। (এবং হ্যাঁ, ব্যর্থতা নির্ভরতা সরাসরি তার ফাইল থেকে আমদানি করা হয়)
নিক

4
@ গন্টেরজ্যাচবাউয়ার রেফারেন্স সহ আমার উত্তর আপডেট করেছি। আমি আপনার উত্তর থেকে সরিয়ে নেওয়ার চেষ্টা করছি না, তবে এটি আসলে সমস্যাটি সমাধান করে এবং লোকেরা এটি সম্পর্কে জানতে হবে। আপনি প্রশ্ন google যদি কোনো ফলাফল ব্যবহার বলছি আছে forwardRef। এটি খুঁজে পাওয়া খুব কঠিন। এই সমস্যাটি সমাধান করার জন্য আমাকে গতকাল সারা দিন ধরে নিয়ে গেছে।
বিক্রিয়

রহস্যময়। আমি কমপক্ষে এক ডজন উত্তর পোস্ট foreardRefকরেছি যা নিজেকে ব্যবহার করার পরামর্শ দেয় তবে NgModuleপরিচয় করার পরে আর হয় না । আমি reps হারাতে উদ্বিগ্ন না। আমি কৌতূহলী যে আপনি কেন এটির দিকে চলে যাচ্ছেন কয়েক মাসের পরে এটি আর পপ আপ হয়নি। আমি কয়েক দিনের মধ্যে বাড়ি ফিরলে আমার আরও ঘনিষ্ঠ চেহারা হবে। মতামতের জন্য অনেক ধন্যবাদ।
Gternter Zöchbauer

2
যদি কেউ আমদানি সম্পর্কেও হারিয়ে যায়: '@ কৌনিক / কোর' থেকে আমদানি করুন {উপাদান, ইনজেকশন, ফরোয়ার্ড রেফফ্যান, ফরোয়ার্ড রেফ;;
নাটানেল

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: আপনি ভুলে গেছেন: '@ কৌনিক / মূল' থেকে import ইনজেকটেবল import আমদানি করুন;

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

সঠিক:

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

27

ইতিমধ্যে যেমনটি বলা হয়েছে, ব্যারেলের মধ্যে রফতানি ক্রমানুসারে সমস্যাটি ঘটে যা বিজ্ঞপ্তি নির্ভরতার কারণে ঘটে।

আরও বিশদ বিবরণটি এখানে: https://stackoverflow.com/a/37907696/893630


3
অর্ডার করা আমার সমস্যার সমাধান করেনি। ব্যারেল ব্যবহার না করে।
মাইকেল লাফারগু

21

আমি পরিষেবা A এ পরিষেবা বিতে এবং এর বিপরীতে ইনজেকশন দিয়েও এর মুখোমুখি হয়েছি।

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

অতএব, আমার নিম্নলিখিত প্রস্তাবনা রয়েছে:

  • যদি আপনি বোধ করেন ক্লাসগুলি খুব ঘন ঘন ইন্টারঅ্যাক্ট করে (আমি বৈশিষ্ট্য হিংসার কথা বলছি ) তবে আপনি 2 টি পরিষেবা 1 শ্রেণিতে মার্জ করার বিষয়টি বিবেচনা করতে পারেন ।
  • যদি উপরেরগুলি আপনার পক্ষে কাজ করে না, তবে একটি তৃতীয় পরিষেবা ব্যবহারের কথা বিবেচনা করুন , (এ EventService) যা উভয় পরিষেবা বার্তাগুলি বিনিময় করতে ইনজেক্ট করতে পারে।

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

17

অনুসন্ধানকারীদের সুবিধার জন্য; আমি এই ত্রুটি পেয়েছি। এটি কেবল একটি নিখোঁজ @ প্রতীক ছিল।

অর্থাৎ এটি Can't resolve all parameters for MyHttpServiceত্রুটি তৈরি করে ।

Injectable()
export class MyHttpService{
}

নিখোঁজ @প্রতীক যোগ করা এটি ঠিক করে দেয়।

@Injectable()
export class MyHttpService{
}

2
আমার ক্ষেত্রে, আমি @ ইনজেক্টেবল এবং সার্ভিস ক্লাস সংজ্ঞায়নের মধ্যে অতিরিক্ত ক্লাস এবং ইন্টারফেস যুক্ত করেছি, সুতরাং পরিষেবা শ্রেণি আর ইনজেক্টেবল হিসাবে চিহ্নিত হয়নি।
হার্ক

আপনি যদি অন্য ইনজেক্টেবল পরিষেবা গ্রাস করে এমন কোনও পরিষেবা শ্রেণীর @ ইনজেকটেবল () ডেকরেটারকে পুরোপুরি ভুলে যান তবে আপনার অযথাযথভাবে সজ্জিত পরিষেবাটিও এই ত্রুটিটি ছুঁড়ে দেবে।
আই বুচান

10

আমার ক্ষেত্রে, import "core-js/es7/reflect";আমার @Injectableকাজটি করার জন্য আমার অ্যাপ্লিকেশনটিতে যুক্ত করা দরকার ।


9

আর একটি সম্ভাবনা emitDecoratorMetadatatsconfig.json- তে সত্য হয়ে উঠছে না

{
  "compilerOptions": {

     ...

    "emitDecoratorMetadata": true,

     ...

    }

}

8

এই ত্রুটি, যদি আপনি সেবা আছে একটি করে একটি উপর নির্ভর করে স্ট্যাটিক সম্পত্তি / পদ্ধতি সেবার বি ও সেবা বি নিজেই সেবা উপর নির্ভর করে একটি নালা নির্ভরতা ইনজেকশন। সুতরাং এটি এক ধরণের বৃত্তাকার নির্ভরতা, যদিও সম্পত্তি / পদ্ধতিটি স্থিতিশীল নয়। সম্ভবত একটি বাগ যা এওটির সাথে সংমিশ্রণে ঘটে ।


একই ফাইলে সংজ্ঞায়িত কোনও ফাংশনের উপর নির্ভরতা থাকার সময় আমারও তা ছিল। এটি একটি পৃথক ফাইলে বিভক্ত করা ঠিক করে দিয়েছে।
জো

1
এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ। আমি নিজেকে সঠিক পরিস্থিতিতে খুঁজে পেয়েছি। আমি বুঝতে পারি নি যে সরাসরি স্ট্যাটিক ক্লাসে অ্যাক্সেস করার সাথে ডিআই এর সাথে কিছু করার থাকতে পারে। আমার এই স্কিমটি ছিল: A -> Bএবং দুজনেই একই স্ট্যাটিক ক্লাস ব্যবহার করছিল। forwardRefসাহায্যে সমাধান , তবে আমি কীভাবে এটি অনুযুক্ত হতে পারে তা দেখতে যাচ্ছি। আমি সম্ভবত স্থিতিশীল শ্রেণীর বাইরে একটি আসল পরিষেবা করার চেষ্টা করব (এটি আরও ভাল ডিজাইনের দিকে পরিচালিত করবে)।
স্লাভা ফমিন দ্বিতীয়

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

আমার জন্য এটি কেবলমাত্র ()@ ইনজেক্টেবলের অভাব ছিল । যথাযথ @ ইনজেক্টেবল ()


অথবা আমার ক্ষেত্রে দুর্ঘটনাক্রমে @
টিডিপি

4

ইনজেকটেবল কনস্ট্রাক্টর () পদ্ধতি থেকে পরামিতিগুলি সরিয়ে ফেলা আমার ক্ষেত্রে এটি সমাধান করেছে।


এটিও আমার সমস্যা ছিল। আমি এটি পোস্ট করতে এসেছি কিন্তু আপনি খুঁজে পেয়েছি! +1
এজেড

তারপরে কীভাবে পুনরায় ব্যবহারযোগ্য পরিষেবার জন্য পরামিতিগুলি প্রেরণ করবেন?
3gwebtrain

4

আমার ক্ষেত্রে এটি প্লাগইন অগুরির কারণে ছিল, এটি ঠিকঠাকভাবে কার্যকর করবে। বিকল্প বিকল্প আওট হয়, এছাড়াও কাজ করে।

@ কবিদের সমস্ত ক্রেডিট, তিনি এখানে পোস্ট করেছেন: https://github.com/angular/angular/issues/23958


2

আমার জন্য সমস্যাটি আরও বিরক্তিকর ছিল, আমি একটি পরিষেবার মধ্যে একটি পরিষেবা ব্যবহার করছিলাম এবং এটি অ্যাপ্লিকেশনটিতে নির্ভরতা হিসাবে যুক্ত করতে ভুলে গেছি! আশা করি এটি এটিকে আবার ব্যাক আপ করতে কেবল অ্যাপটি ভাঙতে কয়েক ঘন্টা বাঁচাতে সহায়তা করবে


1
আমি সবেমাত্র একটি @Injectটীকা অনুপস্থিত । আমি ত্রুটি বার্তাটি কি বলে ঠিক ঠিক সেদিকেই নজর দিচ্ছিলাম। আপনি যদি বিজ্ঞপ্তি নির্ভরতা সন্দেহ করেন না, কেবল ত্রুটিতে উল্লিখিত শ্রেণিতে যান এবং সমস্ত কনস্ট্রাক্টর প্যারামিটার এবং কোনও বর্গ সদস্যের সাথে মন্তব্য করা হয় @Injectএবং নিশ্চিত হন যে আপনি সেগুলি সবই ডিআই করছেন। ডিআই-তে আরও এখানে: কৌণিক.ই.ও.
আলেকজান্ডার টেলর

2

আপনাকে @ কম্পোনেন্ট ডেকরেটারে বা আপনার উপাদানটি ঘোষিত মডিউলটিতে সরবরাহকারী অ্যারে যুক্ত করতে হবে। উপাদানগুলির অভ্যন্তরে আপনি নীচের মতো করতে পারেন:

@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

আমার জন্য, আমি যখন ভুলভাবে পলিফিল.স.টি. ফাইলে এই আমদানিটি অক্ষম করেছিলাম তখন আমার এই ত্রুটিটি ঘটেছে, আপনাকে ত্রুটিটি এড়াতে এটি আমদানি করা হয়েছে তা নিশ্চিত করতে হবে।

/** 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 তারিখপিকারে ick

সুতরাং মূলত আমি @Injectableএ্যানোটেশন যুক্ত করতে ভুলে গেছি ।

আমি এটিকে আমার "কাস্টমডেটএডাপ্টার" শ্রেণিতে যুক্ত করার পরে:

@Injectable({
  providedIn: 'root'
})

ত্রুটি চলে গেছে।


এটি আমার পক্ষে কাজ করেছে, তবে কেন তা আমার কোনও ধারণা নেই। ডিআইয়ের মাধ্যমে এটি যে পরিষেবা এবং উপাদানটি গ্রহণ করে তাদের উভয়কেই কি সরবরাহ করা দরকার: ডিআই কাজ করার জন্য মূল?
মাইক ফারলেন্ডার

2

এই উত্তরটি এই সমস্যার জন্য খুব সহায়ক হতে পারে। এছাড়াও, আমার ক্ষেত্রে, defaultকারণ হিসাবে পরিষেবাটি রফতানি করা হয়েছিল।

জালেম হয়ে গেছে

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

সঠিক:

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

2

ত্রুটির প্রতিক্রিয়া না থাকার কারণে এটি ডিবাগ করা সত্যিই কঠিন সমস্যা হতে পারে। আপনি যদি সত্যিকারের চক্রীয় নির্ভরতা সম্পর্কে উদ্বিগ্ন হন তবে এখানে স্ট্যাকের সন্ধানে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি বিবেচনা করা হবে ক) পরিষেবাটির নাম খ) সেই পরিষেবাদির কনস্ট্রাক্টর প্যারামিটারটিতে একটি প্রশ্ন চিহ্ন রয়েছে যেমন যদি এটি এর মতো দেখায়:

অ্যাথ সার্ভিসের সমস্ত পরামিতি সমাধান করতে পারে না: ([অবজেক্ট অবজেক্ট], [অবজেক্ট অবজেক্ট], [অবজেক্ট অবজেক্ট], [অবজেক্ট অবজেক্ট],?))

তারপরে এর অর্থ হ'ল 5 ম প্যারামিটারটি এমন একটি পরিষেবা যা অথ সার্ভিসের উপরও নির্ভর করে। অর্থাত্ প্রশ্ন চিহ্ন, এর অর্থ এটি ডিআই দ্বারা সমাধান করা হয়নি।

সেখান থেকে, আপনাকে কোডটি পুনর্গঠন করে কেবল 2 টি পরিষেবা ডিকুয়াল করা দরকার।


1

আমি সার্ভিসের নামটি, অর্থাৎ কনস্ট্রাক্টর (প্রাইভেট মাই সার্ভিস: মাই সার্ভিস) টি ভুল করে এই ত্রুটির মুখোমুখি হয়েছি ) টি ।

ভুল বানানযুক্ত পরিষেবার জন্য, Chrome-> কনসোলে পৃষ্ঠাটি পরিদর্শন করে আমি কোন পরিষেবাটি সমস্যা ছিল তা নির্ধারণ করতে সক্ষম হয়েছি (কনস্ট্রাক্টারে আমার বেশ কয়েকটি তালিকাভুক্ত ছিল)। আপনি বার্তার অংশ হিসাবে অবজেক্ট অবজেক্ট, অবজেক্ট অবজেক্ট, প্রদর্শন করে একটি "প্যারামিটার" অ্যারে তালিকা দেখতে পাবেন? (বা এরকম কিছু)। লক্ষ্য করুন কোথায় "?" সমস্যাটি হ'ল সার্ভিসের অবস্থান এবং এটি।


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

আমার ক্ষেত্রে, আমি একই উপাদান ফাইল থেকে একটি ক্লাস এবং একটি এনাম রফতানি করছিলাম:

mComponent.component.ts:

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

তারপরে, আমি MyEnumএকটি সন্তানের কাছ থেকে ব্যবহার করার চেষ্টা করছিলাম MyComponentClass। এটি সমস্ত পরামিতি ত্রুটির সমাধান করতে পারে না

এর MyEnumথেকে আলাদা ফোল্ডারে চলে যাওয়ার ফলে MyComponentClassএটি আমার সমস্যার সমাধান করেছে!

গন্টার জ্যাচবাউয়ার যেমন উল্লেখ করেছেন, কোনও পরিষেবা বা উপাদানটি বৃত্তাকার উপর নির্ভরশীল হওয়ার কারণে এটি ঘটছে।


1

যদি আপনার পরিষেবাকে একই ফাইলটিতে কোনও উপাদান হিসাবে সংজ্ঞায়িত করা হয় (যা এটি গ্রহণ করে) এবং পরিষেবাটি পরে সংজ্ঞায়িত করা হয় ফাইলের উপাদানটির তবে আপনি এই ত্রুটিটি পেতে পারেন। এটি অন্যদের উল্লেখ করা একই 'ফরোয়ার্ড রেফ' সমস্যার কারণে to এই মুহুর্তে ভিএসকোড আপনাকে এই ত্রুটিটি দেখানোর বিষয়ে দুর্দান্ত নয় এবং বিল্ডটি সফলভাবে সংকলন করেছে।

সংকলকটি --aotযেভাবে কাজ করে (সম্ভবত গাছ কাঁপানোর সাথে সম্পর্কিত) এর কারণে বিল্ডটি চালানো এই সমস্যাটি মাস্ক করতে পারে।

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

আমার যদি খুব সাধারণ পরিষেবা থাকে যা একটি উপাদানগুলির সাথে খুব দৃ strongly়ভাবে আবদ্ধ (যেমন একটি ভিউ মডেলের মতো সাজানো) - যেমন। ImageCarouselComponent, আমি এটির নাম রাখতে পারি ImageCarouselComponent.service.tsযাতে এটি আমার অন্যান্য পরিষেবার সাথে মিশ্রিত না হয়।


1

আমার ক্ষেত্রে এটি একটি বিজ্ঞপ্তি রেফারেন্স ছিল। আমার মাই সার্ভিসকে মাইসারওয়াইস 2 এবং মাই সার্ভিস 2 কল করে মাই সার্ভিস কল করছিল।

ভাল না :(


1

আমার ক্ষেত্রে কারণটি নিম্নলিখিত ছিল:

  • আমার ইনজেকশনযোগ্য পরিষেবা এ আরও একটি ক্লাস বি বাড়িয়েছে
  • বি এর একটি কনস্ট্রাক্টর ছিল যার পক্ষে যুক্তি প্রয়োজন
  • আমি এ-তে কোনও নির্মাণকারীর সংজ্ঞা দিইনি

ফলস্বরূপ, একটি বস্তু A তৈরি করার চেষ্টা করার সময়, ডিফল্ট কনস্ট্রাক্টর ব্যর্থ হয়েছিল। কেন এটি একটি সংকলন ত্রুটি ছিল না আমার কোনও ধারণা নেই।

আমি এটি এ-তে কেবল একটি কনস্ট্রাক্টর যুক্ত করে ঠিক করেছি, যা সঠিকভাবে বি এর কনস্ট্রাক্টর বলে called


1

Gotcha!

উপরের উত্তরগুলির মধ্যে যদি কোনও আপনাকে সহায়তা না করে, আপনি সম্ভবত একই ফাইলটি থেকে কোনও উপাদান আমদানি করছেন যেখানে কোনও উপাদান পরিষেবা ইনজেক্ট করছে।

আমি আরও ভাল ব্যাখ্যা:

এটি পরিষেবা ফাইল :

// 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'
})

.. ঠিক আপনার সার্ভিস ক্লাসের উপরে অন্য কোনও লাইন নেই

সুবিধাদি

  • কোনও মডিউলে পরিষেবা যুক্ত করার দরকার নেই (এটি "স্বয়ংক্রিয়ভাবে আবিষ্কার করা" হবে)
  • পরিষেবাটি সিঙ্গলটন হবে (যেহেতু এটি রুটে ইনজেকশন করা হবে)

[ কৌণিক ডক্স ]

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