javascript - कोणीय 6 निर्भरता इंजेक्शन




angular typescript angular-cli angular6 (5)

हमेशा जब कई समाधान उपलब्ध होते हैं तो यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं। लेकिन प्रलेखन आपको चुनने के लिए कुछ निर्देश देता है।

कभी-कभी एप्लिकेशन रूट इंजेक्टर में हमेशा एक सेवा प्रदान करना वांछनीय नहीं होता है। शायद उपयोगकर्ताओं को सेवा का उपयोग करने के लिए स्पष्ट रूप से ऑप्ट-इन करना चाहिए, या सेवा को आलसी लोड वाले संदर्भ में प्रदान किया जाना चाहिए। इस मामले में, प्रदाता को एक विशिष्ट @NgModule class साथ जोड़ा जाना चाहिए, और जो भी इंजेक्टर द्वारा उपयोग किया जाएगा, @NgModule class यह मॉड्यूल शामिल होगा।

इसलिए मूल रूप से आप providedIn: 'root' का उपयोग करेंगे providedIn: 'root' किसी भी सेवा के लिए providedIn: 'root' जो कि व्यापक है। अन्य सेवाओं के लिए पुराने संस्करण का उपयोग करते रहें।

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

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

इस तरह यह सेवा केवल MyComponent और इसके उप-घटक ट्री में उपलब्ध हो जाती है।

एंगुलर 6 की नवीनतम रिलीज़ में, सेवा मेटाडाटा में दिए providedIn संपत्ति में एक मॉड्यूल का उपयोग करके पंजीकृत है:

@Injectable({
  providedIn: 'root',
})
export class HeroService {}

हालाँकि प्रलेखन अभी भी मॉड्यूल मेटाडेटा में मॉड्यूल providers सरणी में सेवा को पंजीकृत करने के लिए संदर्भित करता है जैसे हमने Angular 5 में किया था:

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

तो इंजेक्टर को सेवा के बारे में पता करने के लिए किस विधि का उपयोग किया जाना चाहिए कि यह इंजेक्ट होना चाहिए और मॉड्यूल प्रदाता की सरणी विधि को हटा दिया जाएगा?


यदि आप कोणीय 5+ डेवलपर का उपयोग कर रहे हैं, तो यह प्रदान किए जाने पर स्वचालित रूप से इंजेक्टेबल सेवा का निर्माण करेगा: 'रूट', इस मामले में आपको app.module.ts में सेवा को आयात करने की आवश्यकता नहीं होगी। आप इसे सीधे दूसरे घटक में उपयोग कर सकते हैं।


मूल रूप से आप या तो उपयोग कर सकते हैं, लेकिन नए सीएलआई के अनुसार service बनाते समय स्वचालित रूप से जोड़ा जाएगा

इसमें प्रदत्त

अब एक नया, अनुशंसित, प्रदाता को पंजीकृत करने का तरीका है, सीधे @Injectable() डेकोरेटर के अंदर, नए दिए गए विशेषता का उपयोग करके। यह आपके आवेदन के मूल्य या किसी भी मॉड्यूल के रूप में 'root' को स्वीकार करता है। जब आप 'root' उपयोग करते हैं, तो आपके इंजेक्टेबल को एप्लिकेशन में एक सिंगलटन के रूप में पंजीकृत किया जाएगा, और आपको इसे रूट मॉड्यूल के प्रदाताओं में जोड़ने की आवश्यकता नहीं है। इसी प्रकार, यदि आप providedIn: UsersModule उपयोग करते हैं providedIn: UsersModule , इंजेक्टेबल को मॉड्यूल के प्रदाताओं में शामिल किए बिना UsersModule प्रदाता के रूप में पंजीकृत किया जाता है।

इस नए तरीके को एक बेहतर ट्री-शेकिंग के लिए पेश किया गया है। वर्तमान में एक मॉड्यूल के प्रदाताओं में जोड़ी जाने वाली सेवा अंतिम बंडल में समाप्त हो जाएगी, भले ही इसका उपयोग एप्लिकेशन में न किया गया हो, जो थोड़ा दुखद है।

अधिक जानकारी के लिए कृपया यहाँ देखें


@NgModule() और @Component() सज्जाकारों के पास प्रदाता मेटाडेटा विकल्प है, जहां आप प्रदाताओं को NgModule-level या घटक-स्तरीय इंजेक्टर के लिए कॉन्फ़िगर कर सकते हैं।

@ इंजेक्टेबल () डेकोरेटर के पास प्रोवाइड मेटाडेटा विकल्प होता है, जहाँ आप डेकोर इंजेक्टर के प्रदाता को रूट इंजेक्टर के साथ या विशिष्ट एनमॉड्यूल के लिए इंजेक्टर के साथ निर्दिष्ट कर सकते हैं।

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

यहाँ निर्भरता इंजेक्शन के बारे में अधिक


  • jQuery आपके अधिकांश डोम हेरफेर का ख्याल रखेगा
  • backbone.js आपको अपने सभी कोड व्यवस्थित करने में मदद करेगा और आपके जेएस एप्लिकेशन को कुछ संरचना (एमवीसी पैटर्न) देगा
  • underscore.js आपको वास्तव में उपयोगी निम्न-स्तरीय उपयोगिता प्रदान करेगा। जब तक मैं वास्तव में जेएस ऐप्स में नहीं जाता तब तक मुझे इस लाइब्रेरी की आवश्यकता नहीं होती थी (यह backbone.js के लिए भी एक आवश्यकता है)






javascript angular typescript angular-cli angular6