8

का उपयोग कर वेब ऐप के लिए परिपत्र निर्भरताएं मैं निम्नलिखित स्थिति में हूं।बैकबोन.मारियनेट और आवश्यक जेएस

मैं मॉड्यूल लोड करने के लिए requJs का उपयोग कर रहा हूं और मैं वैश्विक चर का उपयोग नहीं करना चाहता हूं।

राउटर लोड करने के लिए main.js जिम्मेदार है।
फिर राउटर ऐप लोड करता है और ऐप कई उप-एप लोड करता है।

सबकुछ शुरू होने के बाद, उप-ऐप्स को router.navigate बनाने के लिए router की आवश्यकता है।

यहाँ स्कीमा:

main.js -> router -> app -> subApp -> router 

तब मैं सर्कुलर निर्भरता की एक समस्या है और इस कारण subApp में रूटर अपरिभाषित हो जाएगा।

मेरे कोड को पुनर्गठित करने या इस समस्या को ठीक करने का सबसे अच्छा तरीका क्या है? क्या इसके बारे में कुछ उदाहरण हैं?

+0

मैंने सोचा था कि requjs को परिपत्र निर्भरता को सही तरीके से संभालना था ... (मैं ईमानदारी से नहीं जानता। मैं requjs का प्रशंसक नहीं हूं) –

+0

नहीं, ऐसा नहीं है। यह घटना आपको बताती है कि यह एक परिपत्र निर्भरता है - चीजें सिर्फ काम करना बंद कर देती हैं और कुछ संदर्भ अपरिभाषित हो जाते हैं। –

उत्तर

5

स्कीमा:

main.js -> router -> app -> subApp -> router 

सही है।

आप, backbone.marionette उपयोग कर रहे हैं एप्लिकेशन और subApp से रूटर तक पहुँचने के लिए, global var का उपयोग किए बिना, आप इस तरह से रूटर में एप्लिकेशन शुरू कर देना चाहिए:


// router.js 
YourApp.start(router: router); 

// app.js 
YourApp.addInitializer(function(options){ 
    // do useful stuff here 
    var myView = new MyView({ 
    router: options.router 
    }); 
    YourApp.mainRegion.show(myView); 
}); 
+1

ऐप सिर्फ राउटर को पास नहीं करना चाहिए? ऐसा लगता है कि राउटर ऐप शुरू करेगा। यदि आपके पास एकाधिक राउटर हैं तो क्या होगा? @AntoJs –

2

Subapp घटनाओं रूटर रूटर

+0

धन्यवाद, क्या आप मुझे एक उदाहरण भेज सकते हैं? –

+0

आप कहते हैं कि उप ऐप घटना बढ़ा सकता है, लेकिन किस मॉड्यूल पर? अगर मैं उप ऐप से ऐप आयात करने का प्रयास करता हूं तो मेरे पास समान परिपत्र निर्भरता समस्या है। –

2

पर एक स्पष्ट निर्भरता होने मेरी परियोजना में के बजाय संभालती है जो बढ़ा सकते हैं, मैं निम्नलिखित निर्भरता का उपयोग करें: main.js -> एप्लिकेशन -> रूटर -> subApp।

app.js में, मैं एक भी वैश्विक चर है कि मेरे ऐप के लिए सूचक धारण बनाएँ:

define([...], function(...) { 
return { 
    initialize: function() { 
    window.MyApp = new Backbone.Marionette.Application(); 
    // ... 
    MyApp.start(); 
    } 
}; 
}); 

यह यह अत्यंत कहीं से भी मेरे ऐप की क्षेत्रों का उपयोग करने के लिए आसान है, साथ ही बनाता दुकान वैश्विक स्थिति जानकारी एक नाम अंतरिक्ष में।

मैंने इसे पहले वैश्विक ऐप के बिना करने की कोशिश की, लेकिन अंत में छोड़ दिया और यह दृष्टिकोण बहुत अधिक लचीला होने लगा।