angularjs tutorial कोण से इंजेक्टर को पुनः प्राप्त नहीं किया जा सकता




angularjs tutorial pdf (3)

मुझे दो मॉड्यूल के साथ यह ऐप मिला है:

angular.module('components', []).directive('foo', function () { return {};});
angular.module('gaad', ['components']);

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

var injector = angular.injector(['gaad', 'components']); //called after 'gaad' module initialization

त्रुटि फेंक दी गई है:

Uncaught Error: Unknown provider: $compileProvider from components 

यह आवेदन अभी काफी बड़ा है और मुझे कोई अंदाज़ा नहीं है कि मुझे बग के लिए कहाँ दिखना चाहिए। तो मेरा सवाल है: मेरी समस्याओं का कारण क्या हो सकता है?

संपादित करें: मैं अपनी समस्या को दोहराने में सक्षम था: http://jsfiddle.net/selbh/ehmnt/11/


समस्या का कोणीय कोड के निष्पादन के प्रवाह में है @ Pkozlowski.opensource के उत्तर और संबंधित टिप्पणियों को एकीकृत करने के लिए, ध्यान दें कि मॉड्यूल कोड निष्पादित किए जाने के बाद $injector INjector संपत्ति को DOM तत्वों के लिए उपलब्ध कराया जाता है, ताकि जब आप संपत्ति का उपयोग करें (जैसा कि आप console.log कोशिश करते हैं) संपत्ति अभी भी undefined होगी।

आप बस लॉगिंग फ़ंक्शन के निष्पादन के लिए 0 समयबाह्य सेट करके इस समस्या को हल कर सकते हैं (यानी, मिलीसेकेंड में कोई स्पष्ट देरी की आवश्यकता नहीं है)। यह हैक काम करता है क्योंकि लॉगिंग फ़ंक्शन निष्पादित होगा जब स्टैक खाली है, तब वह होगा जब कांच का बूटस्ट्रैपिंग समाप्त हो गया और $injector संपत्ति DOM तत्वों के लिए उपलब्ध है।

किसी अन्य (शायद बेहतर) अंगुलियों के शब्दों में समाधान एक रन ब्लॉक में अपने $injector पहुंचने वाला कोड शामिल करना होगा ( संबंधित एपीआई भी देखें)। $injector को सामान्य सेवा के रूप में प्रारंभिक रूप से आसानी से इंजेक्शन किया जा सकता है यह काम करता है क्योंकि रन ब्लॉक कतारबद्ध होते हैं और सभी बूटस्ट्रैप समाप्त होने पर अतुल्यकालिक निष्पादित होते हैं।

नीचे आपको दो फिडेल्स मिल सकते हैं, प्रत्येक समाधान के लिए एक

0 टाइमआउट जेएसफ़िल्ड

भागो ब्लॉक jsFiddle

संपादित करें

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


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

इसके बाद, मैं समझ सकता हूं कि आप $injector को पुनः प्राप्त करना चाहते हैं और इसके बारे में एक नया उदाहरण नहीं बना सकते हैं। बात यह है कि angular.injector मॉड्यूल के लिए एक नया $injector उदाहरण बना देगा (एक ऐप) जिसे तर्क के रूप में निर्दिष्ट किया गया है। यहां मुख्य AngularJS मॉड्यूल (एनजी) स्पष्ट रूप से निर्दिष्ट होना चाहिए। इसलिए, इस कोड उदाहरण में:

var injector = angular.injector(['gaad', 'components']);

आप 'gaad' और 'components' मॉड्यूल में निर्धारित घटकों से एक नया इंजेक्टर बनाने की कोशिश कर रहे थे और जाहिर है $compileProvider आपके कस्टम मॉड्यूल में परिभाषित नहीं है सूची में ng मॉड्यूल जोड़ना एक नई इंजेक्टर बनाकर समस्या को "हल" करेगा - ऐसा कुछ जिसे आप शायद नहीं करना चाहते।

वास्तव में चल रहे अनुप्रयोग से जुड़े एक इंजेक्टर उदाहरण को पुनः प्राप्त करने के लिए हम 2 विधियों का उपयोग कर सकते हैं:

  • एंजरीआरजेएस जावास्क्रिप्ट के भीतर से सरल समाधान सिर्फ $injector को इंजेक्ट करना है: http://docs.angularjs.org/api/angular.injector
  • AngularJS दुनिया के बाहर - कॉल angular.element([DOM element]).injector() जहां [डोम एलिमेंट] एक गुंबद तत्व है जहां ng-app परिभाषित किया गया था (या इस तत्व का कोई भी बच्चा तत्व)। यहां अधिक जानकारी: http://docs.angularjs.org/api/angular.element

इंजेक्टर पुनःप्राप्ति के 2 तरीके दिखाए जाने वाला जेएसफ़ील्ड यहां है: http://jsfiddle.net/xaQzb/

कृपया यह भी ध्यान रखें कि $injector का उपयोग सीधे यूनिट परीक्षण के बाहर बहुत ही सामान्य परिदृश्य नहीं है। AngularJS दुनिया के बाहर AngularJS सेवाओं को पुनः प्राप्त करने के लिए यह उपयोगी विचार हो सकता है यहां अधिक जानकारी: विरासत कोड से कोणीय जेएस को कॉल करें ।


ऐसा प्रतीत होता है कि आपको इंजेक्टर में एनजी को भी शामिल करना होगा।

var injector = angular.injector(['ng', 'b', 'a']);

से: AngularJS: इंजेक्टर

एनजी मॉड्यूल स्पष्ट रूप से जोड़ा जाना चाहिए।





angularjs