2013-10-02 12 views
21

महान article from Dan Wahlin के लिए धन्यवाद, मैं कोणीय नियंत्रकों और सेवाओं की आलसी लोडिंग को लागू करने में कामयाब रहा। हालांकि, आलसी लोड स्वतंत्र मॉड्यूल के लिए एक साफ तरीका प्रतीत नहीं होता है।LazJ लोडिंग AngularJS मॉड्यूल RequJS

बेहतर मेरे सवाल व्याख्या करने के लिए, मान लें कि मैं एक ऐप्स संरचना के रूप में नीचे RequireJS बिना हो जाएगा कि:
http://plnkr.co/aiarzVpMJchYPjFRrkwn

कोर:

// Create independent module 'dataServices' module with 'Pictures' object 
angular.module("dataServices", []).factory("Pictures", function (...) {...}); 

// Create 'webapp' ng-app, with dependency to 'dataServices', defining controllers 
angular.module("webapp", ['dataServices']) 
.controller("View1Controller", function (...) {...}) 
.controller("View2Controller", function (...) {...}); 

यहाँ Plunker में RequireJS के साथ नमूना अनुप्रयोग है समस्या यह है कि कोणीय ng-app पोस्ट तत्कालता पर निर्भरता जोड़ने की अनुमति नहीं देता है। नतीजतन, मेरा समाधान में उपयोग किए जाने वाले Picture ऑब्जेक्ट का उदाहरण पुनर्प्राप्त करने के लिए angular.injector का उपयोग करना है। js/scripts/controllers/ctrl2.js फ़ाइल देखें। कोणीय के बाहर चलाता है और इसलिए सभी async कॉल $ गुंजाइश के साथ समाप्त होना चाहिए

  1. इंजेक्शन सेवाओं $ (लागू)
  2. गन्दा कोड जहां कुछ वस्तु इंजेक्ट किया जा सकता:

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

क्या आप में से कोई भी यह समझता है कि आवश्यकताजेएस का उपयोग करके स्वतंत्र मॉड्यूल को आलसी लोड कैसे करें और किसी भी तरह से इस मॉड्यूल को कोणीय में हुक करें ताकि सामान्य कोणीय निर्भरता इंजेक्शन सिंटैक्स का उपयोग किया जा सके?

नोट:
सवाल स्वतंत्र मॉड्यूल की आलसी लोड हो रहा है पर है। इस विशिष्ट उदाहरण का एक आसान समाधान ng-app.config के दौरान कैश किए गए $ प्रदाताओं का उपयोग करके "चित्र" ऑब्जेक्ट बनाना है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं ऐसे समाधान की तलाश में हूं जो तृतीय पक्ष मॉड्यूल जैसे angular-resource के साथ काम करता है।

+0

मैं खोज की इस [समाधान] [1] jQuery और $ routeProvider के संकल्प के साथ [1]: http://stackoverflow.com/a/28199498/4504198 –

+0

@marcoseu: Offtopic: प्रयास करें angularAMD से संबंधित इस सवाल को भी देखें। : http://stackoverflow.com/questions/31288001/how-to-use-chart-js-with-angular-chart-using-requirejs – VBMali

उत्तर

10

GitHub में अपने प्रोजेक्ट पर एक नज़र डालें: angular-require-lazy

इस परियोजना के एक विचार का प्रदर्शन और विचार विमर्श के लिए प्रेरित करने का इरादा है। लेकिन है जो आप चाहते हैं (expenses-view.js देखें, यह आजी-ग्रिड आलसी लोड करता है)।

मैं बहुत टिप्पणियों में दिलचस्पी है, विचारों आदि


(संपादित) के रूप में एनजी ग्रिड कोणीय मॉड्यूल आलसी लोड:

  1. expenses-view.js lazily भरी हुई है, जब /expenses मार्ग सक्रिय है
  2. expenses-view.js निर्भरता के रूप में एनजी-ग्रिड निर्दिष्ट करता है, इसलिए RequJs लोड करता है ng-grid पहले
  3. ng-g छुटकारा एक है कि कॉल angular.module(...)

आदेश यह पूरा करने में है, मैं (वास्तव में प्रॉक्सी) अपने खुद के साथ वास्तविक angular.module विधि, आलस्य का समर्थन करता है कि बदल दिया।bootstrap.js और route-config.js देखें (फ़ंक्शन initLazyModules() और callRunBlocks())।

  1. कॉन्फ़िग कार्यों को लागू नहीं किया जाता है (अभी तक):

    इस कार्यान्वयन अपनी कमियां है कि आप के बारे में पता होना चाहिए है। मुझे नहीं पता कि आलसीकॉन्फ़िगर-टाइम निर्भरता प्रदान करता है या नहीं।

  2. परिभाषाओं में आदेश महत्वपूर्ण है। यदि सेवा ए बी पर निर्भर करता है लेकिन ए को आपके मॉड्यूल में बी के बाद परिभाषित किया गया है, तो DI विफल हो जाएगा। ऐसा इसलिए है क्योंकि आलसी एंजुलर प्रॉक्सी परिभाषाओं को निष्पादित करने से पहले परिभाषाओं को तुरंत निष्पादित करता है, वास्तविक कोणीय के विपरीत जो सुनिश्चित करता है कि निर्भरताएं हल हो जाती हैं।

    http://marcoslin.github.io/angularAMD/

    यह config कार्य करता है और संभालती आदेश मॉड्यूल परिभाषाओं से बाहर:

+0

दिलचस्प कार्यान्वयन लेकिन यह वास्तव में "कोणीय" की आलसी लोडिंग पर मेरे प्रश्न का उत्तर नहीं देता है। मॉड्यूल ", जब तक कि मैं कुछ याद नहीं कर रहा हूँ। आपके खर्चों में से कोई भी नहीं- view.js की निर्भरताओं को "angular.module" का उपयोग करके कोड किया गया है। लेकिन मैं इसे जो कुछ करने की कोशिश कर रहा हूं उसके लिए मैं इसे ध्यान में रखूंगा। – marcoseu

+0

शायद संपादन चीजों को थोड़ा बेहतर बताता है। –

+0

मैंने आपके कोड को bootstrap.js में कॉपी किया है, अधिक विशेष रूप से 'makeLazyModule' और 'lazyAngular.module' से संबंधित सबकुछ और यह वास्तव में काम करता है। अब, अगर मुझे केवल यह समझ रहा है कि यह क्यों काम कर रहा है ... – marcoseu

17

मैं angularAMD कहा जाता है और यहां नमूना साइट यह का उपयोग करता है अपने खुद के कार्यान्वयन को अंतिम रूप दिया।

उम्मीद है कि यह दूसरों को RequJS और AngularJS एकीकरण के साथ उनकी मदद करने के लिए कुछ ढूंढने में मदद कर सकता है।

+0

हाय मैं angularAMD को लागू करने की कोशिश कर रहा हूं। इसका उपयोग कर अपने फ़ोल्डर संरचना का पालन करना है ?? यदि वे अलग-अलग फ़ोल्डरों में हैं तो मैं सेवाओं और निर्देशों को शामिल करना चाहता हूं? क्या मै वह कर सकता हूं? – VishwaKumar

+0

@ विश्व कुमार कुमार, आपको मेरी फ़ोल्डर संरचना का पालन करने की आवश्यकता नहीं है। यह आपके 'main.js' में' baseUrl' के सापेक्ष है। – marcoseu

+0

@marcoseu: कृपया इस मुद्दे को देखें (अभी तक हल नहीं हुआ): https://github.com/marcoslin/angularAMD/issues/148 – VBMali

1

ऐसा लगता है कि Node.js मॉड्यूल ocLazyLoad इस आलसी लोडिंग करने का एक तरीका परिभाषित करता है, हालांकि मुझे यकीन नहीं है कि यह अन्य उत्तरों में तरीकों की तुलना में, प्रदर्शन-वार, कैसे करता है, हार्ड-कोडिंग निर्भरता। इस पर किसी भी जानकारी की सराहना की जाएगी। एक दिलचस्प बात यह है कि अन्य उत्तरों को RequireJS संचालित करने की आवश्यकता है, जबकि ocLazyLoad नहीं है।

ऐसा लगता है कि ocLazyLoad एक अन्य प्रदाता को परिभाषित करता है जो युक्त मॉड्यूल को तत्काल चालू करने के बाद निर्भरता को इंजेक्ट करता है। ऐसा लगता है कि मॉड्यूल लोडिंग और प्रदान करने जैसे कुछ निम्न-स्तरीय कोणीय व्यवहार को अनिवार्य रूप से दोहराया जाता है, इसलिए यह इतना जटिल क्यों दिखता है। ऐसा लगता है कि यह केवल प्रत्येक कोर कोणीय मॉड्यूल को निर्भरता के रूप में जोड़ता है: $compileProvider, $q, $injector, ng, और बहुत कुछ।

संबंधित मुद्दे