मैं एक कोणीय प्लगइन का उपयोग कर रहा हूं, जिसे एक InjectionToken का उपयोग करके कॉन्फ़िगरेशन ऑब्जेक्ट प्रदान करके कॉन्फ़िगर करने की आवश्यकता है जो प्लगइन निर्यात करता है।

import { pluginToken } from 'plugin';

@NgModule({
  providers: {
    // Configure the plugin
    //
    // The configuration value string needs to be taken from some other
    // provider (available for dependency injection).
    { provides: pluginToken, useValue: valueString },
  },
})
class MyModule {
  ...
}

मेरे पास समस्या यह है कि valueString किसी अन्य प्रदाता का मान है। मुझे नहीं पता कि @NgModule डेकोरेटर के प्रदाता में निर्भरता को कैसे इंजेक्ट किया जाए। यह कैसे किया जा सकता है?

5
Robert Kusznier 29 अगस्त 2018, 17:31
ऐसा करना बहुत मुश्किल है। क्या यह मान किसी अन्य प्रदाता से HTTP के माध्यम से प्राप्त किया जाएगा?
 – 
Reactgular
29 अगस्त 2018, 17:51
नहीं, यह HTTP द्वारा नहीं लाया गया है। सटीक रूप से यह बिल्ड-टाइम सेट लोकेल का मान है, जो LOCALE_ID टोकन के तहत @angular/core से इंजेक्शन के लिए उपलब्ध है।
 – 
Robert Kusznier
29 अगस्त 2018, 17:53
क्या आपको ठीक उसी मूल्य का उपयोग करने की आवश्यकता है?
 – 
Reactgular
29 अगस्त 2018, 17:55
आपका क्या मतलब है? यह वही लोकेल स्ट्रिंग होनी चाहिए जिसे मैं निर्माण के दौरान --i18n-locale ध्वज द्वारा ng build को पारित करने के दौरान सेट कर सकता था।
 – 
Robert Kusznier
29 अगस्त 2018, 17:58

2 जवाब

सबसे बढ़िया उत्तर

मेरे पास समस्या यह है कि valueString किसी अन्य प्रदाता से एक मान है

आप useExisting का उपयोग करके एक प्रदाता का मूल्य दूसरे को अग्रेषित कर सकते हैं

@NgModule({
    providers: [
        {provide: LOCALE_ID, useValue: 'en'},
        {provide: pluginToken, useExisting: LOCALE_ID},
    ],
})
export class MyModule {}

उपरोक्त उदाहरण में 'en' को pluginToken को सौंपा जाएगा क्योंकि यह LOCALE_ID के मौजूदा मान का उपयोग करता है

3
Reactgular 29 अगस्त 2018, 17:58
ठीक वही जो मुझे चाहिए था। धन्यवाद :)। बीटीडब्ल्यू क्या आपको यह भी पता है कि मामले को कैसे संभालना है, अगर मुझे किसी तरह मूल्य को बदलने की ज़रूरत है? - इस मामले में समान का उपयोग न करें।
 – 
Robert Kusznier
29 अगस्त 2018, 18:00
1
मैं एक फ़ैक्टरी प्रदाता का उपयोग करूंगा जो एक फ़ंक्शन लेता है। सीमा यह है कि फ़ैक्टरी फ़ंक्शन के पास अन्य प्रदाताओं को प्राप्त करने के लिए इंजेक्टर तक पहुंच नहीं है। इसलिए मैंने पूछा कि क्या यह एक HTTP अनुरोध था। जैसा कि समस्या को हल करने के लिए अन्य हैक हैं।
 – 
Reactgular
29 अगस्त 2018, 18:04
कुछ संदर्भ दस्तावेज़ यहां दिए गए हैं: angular.io/guide/…
 – 
lealceldeiro
29 अगस्त 2018, 18:05
सच है, अकेले एक फ़ंक्शन लागू करना वास्तव में आसान है। लेकिन मामले के बारे में क्या है, अगर मुझे उस मूल्य को प्राप्त करने के लिए वास्तव में किसी अन्य प्रदाता को इंजेक्ट करने की आवश्यकता होगी (जैसे आपके उदाहरण के अनुसार HTTP अनुरोध करें)। क्या यह बिल्कुल संभव है?
 – 
Robert Kusznier
29 अगस्त 2018, 18:11
1
आप कर सकते हैं लेकिन मॉड्यूल के साथ नहीं। आप एक कंपोनेंट फैक्ट्री का उपयोग करके एक कंपोनेंट बनाएंगे, और एक इंजेक्टर बनाएंगे जिसमें कस्टम प्रोवाइडर वैल्यू हो। घटक बनाने के लिए आप उस इंजेक्टर का उपयोग करेंगे। उस घटक और उसके सभी बच्चों के पास इस नए प्रदाता तक पहुंच होगी।
 – 
Reactgular
29 अगस्त 2018, 20:18

useValue के बजाय, का उपयोग करके ऑब्जेक्ट इंस्टेंस इंजेक्ट करें। useClass जो

निर्दिष्ट वर्ग का नया उदाहरण बनाता है और लौटाता है


कोड:

// ...
{ provides: pluginToken, useClass: YourConfigurationObjectClass },
//...
1
lealceldeiro 29 अगस्त 2018, 17:47
मेरी गलती, क्योंकि मैंने यह निर्दिष्ट नहीं किया कि मान वास्तव में एक string होना चाहिए, वस्तु नहीं। मैंने सवाल सही किया। क्या आपका उत्तर किसी भी तरह एक आदिम मूल्य भी प्रदान करेगा?
 – 
Robert Kusznier
29 अगस्त 2018, 17:47
क्या आपका मतलब है valueString एक मूल्य है जिसे आप किसी अन्य प्रदाता की विधि (उदाहरण के लिए) का उपयोग करके प्राप्त करते हैं और प्रदाता उदाहरण का उपयोग नहीं करते हैं? पता है कि क्या यह समझ में आता है (मैं क्या पूछ रहा हूं)। मुझे नहीं लगता कि मैं परिदृश्य को सही ढंग से समझता हूं।
 – 
lealceldeiro
29 अगस्त 2018, 17:55
सटीक होने के लिए valueString @angular/core से LOCALE_ID टोकन के तहत इंजेक्शन के लिए उपलब्ध एक स्थानीय स्ट्रिंग है। और यह आपकी गलती नहीं थी कि आपने परिदृश्य को नहीं समझा, जैसा कि मैंने पहले गलत तरीके से कहा था कि मान एक वस्तु है, एक स्ट्रिंग नहीं।
 – 
Robert Kusznier
29 अगस्त 2018, 17:57