2011-10-04 12 views
7

मैं बैकबोन.जेएस को लागू करने वाले मेरे वर्तमान ऐप में कुछ याद कर रहा हूं। समस्या यह है कि मेरे पास एक मास्टर ऐप व्यू है, जो पेज के लिए विभिन्न सबव्यूज़ (एक ग्राफ, सूचना की एक तालिका इत्यादि) शुरू करता है। मेरी इच्छा पृष्ठ के लेआउट को बदलने के लिए नेविगेट करते समय पैरामीटर ध्वज के आधार पर बदलने में सक्षम होना है।बैकबोन व्यू नेस्टिंग

जो मैं चलाता हूं वह एक ऐसा मामला है जहां सबव्यूज, जो टेम्पलेट के बाद होने वाले डोम तत्वों के संदर्भ में होते हैं, मुख्य ऐप व्यू प्रारंभिक प्रक्रिया के दौरान उन तत्वों तक पहुंच नहीं है। तो मुख्य सवाल यह है कि मैं कैसे सुनिश्चित करूं कि प्रत्येक ईवेंट बाइंड प्रक्रिया को ठीक से सेटअप करने के लिए उचित डोम तत्व मौजूद हैं?

निम्न कोड के साथ यदि मेरे पास मेरे लेआउट व्यू के भीतर मॉडल परिवर्तन से जुड़ा कोई ईवेंट है, तो लेआउट प्रदान किया जाता है लेकिन बाद के विचार ठीक से प्रस्तुत नहीं होते हैं। कुछ चीजें जिनके साथ मैंने झुकाया है, वे सभी विचारों को '।' मानों को HTML संरचना के भीतर एक स्थिर तत्व में सेट करना है। यह प्रस्तुति हो रही है, हालांकि यह '.el' का उपयोग करके प्रदान की गई अच्छी स्कोपिंग क्षमता से अलग हो रहा है।

नमूना कोड:

//Wrapped in jquery.ready() function... 
//View Code 
GraphView = Backbone.View.extend({ // init, model bind, template, supporting functions}); 

TableView = Backbone.View.extend({ // init, model bind, template, supporting functions}); 

LayoutView = Backbone.view.extend({ 
    initialize: function() { 
    this.model.bind('change:version', this.render, this); 
    }, 
    templateA = _.template($('#main-template').html()), 
    templateB = _.template($('#secondary-template').html()), 
    render: function() { 
    if ('main' == this.model.get('version')) { 
     this.el.html(this.templateA()); 
    } else { 
     this.el.html(this.templateB()); 
    } 
    }, 
}); 

MainView = Backbone.View.extend({ 
    initialize: function() { 
    this.layoutView = new LayoutView({ 
     el: $('#layoutContainer'), 
     model: layout, 
    }); 
    this.graphView = new GraphView({ 
     el: $('.graphContainer'), 
     model: graph 
    }); 
    this.tableView = new TableView({ 
     el: $('#dataTableContainer', 
     model: dataSet 
    }); 
    }, 
}); 

// Model Code 
Layout = Backbone.Model.extend({ 
    defaults: { 
    version: 'main', 
    }, 
}); 

Graph = Backbone.Model.extend({}); 
dataSet = Backbone.Model.extend({}); 

// Router code... 

// Fire off the app 
AppView = new MainView($('#appContainer')); 
// Create route, start up backbone history 

HTML: सरलता के लिए मैं सिर्फ दो लेआउट के बीच divs पुन: व्यवस्थित।

<html> 
    <head> 
    <!-- include above js and backbone dependancies --> 
    </head> 
    <body> 
    <script type="text/template" id="main-template"> 
     <div class="graphContainer"></div> 
     <div class="dataTableContainer"></div> 
     <div>Some other stuff to identify that it's the main template</div> 
    </script> 
    <script type="text/template" id="secondary-template"> 
     <div class="dataTableContainer"></div> 
     <div>Rock on layout version two!</div> 
     <div class="graphContainer"></div> 
    </script> 
    <div id="appContainer"> 
     <div id="nav"> 
     <a href="#layout/main">See Layout One</a> 
     <a href="#layout/secondary">See Layout Two</a> 
     </div> 
     <div id="layoutContainer"></div> 
    </div> 
    </body> 
</html> 

अंतर्दृष्टि/इनपुट की सराहना करें कि आपके किसी भी व्यक्ति के पास हो सकता है। धन्यवाद!

+0

बस एफवाईआई, आपको अपने कोड में टाइपो का एक गुच्छा मिला है - क्या यह मानना ​​सुरक्षित है कि ये कॉपी/पेस्ट समस्याएं हैं, वास्तविक वाक्यविन्यास त्रुटियां नहीं? – nrabinowitz

+0

दोष प्रतिलिपि/पेस्ट, अंतर्निहित तर्क, उम्मीद है कि अभी भी व्यक्त किया जा रहा है। यह बात बताने के लिए धन्यवाद। – aztechy

उत्तर

8

आपके पास अपने नमूने में बहुत सारे गायब कोड हैं, लेकिन यदि मैं सही ढंग से समझता हूं, तो समस्या यह है कि आप LayoutView द्वारा उत्पन्न HTML पर निर्भर विचार प्रस्तुत करने की कोशिश कर रहे हैं, लेकिन लेआउट को असंकालिक रूप से चुना जा रहा है मॉडल अद्यतन किया गया है, इसलिए LayoutView अभी तक प्रस्तुत नहीं किया गया है।

इस के लिए कई दृष्टिकोण है, लेकिन सामान्य रूप में (काफी सब कुछ रीढ़ से संबंधित के साथ के रूप में) कर रहे हैं:

  • अगर मैं विचारों जो एक "जनक" दृश्य पर निर्भर गाया जा रहा है मैं हूँ, माता-पिता के दृश्य में उन विचारों को तत्काल और प्रस्तुत करने की ज़िम्मेदारी डालें - इस मामले में, LayoutView, MainView नहीं।

  • यदि माता-पिता को असीमित रूप से प्रस्तुत किया जा रहा है, तो उसे कॉलबैक में उस तत्कालता को निष्पादित करने की आवश्यकता है - यहां, LayoutView.render() विधि। - आप initialize() में subviews का दृष्टांत सकता है, और el गुण सेट

    LayoutView = Backbone.view.extend({ 
        initialize: function() { 
        this.model.bind('change:version', this.render, this); 
        // you probably want to call this.model.fetch() here, right? 
        }, 
        templateA: _.template($('#main-template').html()), 
        templateB: _.template($('#secondary-template').html()), 
        render: function() { 
        if ('main' == this.model.get('version')) { 
         this.el.html(this.templateA()); 
        } else { 
         this.el.html(this.templateB()); 
        } 
        // now instantiate and render subviews 
        this.graphView = new GraphView({ 
         // note that I'm using this.$ to help scope the element 
         el: this.$('.graphContainer'), 
         model: graph 
        }); 
        this.tableView = new TableView({ 
         el: this.$('.dataTableContainer'), 
         model: dataSet 
        }); 
        // you probably need to call graphView.render() 
        // and tableView.render(), unless you do that 
        // in their initialize() functions 
        }, 
    }); 
    

    ध्यान दें कि आप इन्स्टेन्शियशन में एक el में पारित करने के लिए नहीं है:

तो मैं इस तरह कोड की संरचना कैसी हो subview.render() में। आप MainView.initialize() में भी तत्काल हो सकते हैं, जैसा कि आप अभी करते हैं, और अतुल्यकालिक रूप से प्रस्तुत करने के लिए LayoutView पर विचारों को पास कर सकते हैं। लेकिन मुझे लगता है कि उपरोक्त दृष्टिकोण शायद क्लीनर है।

+0

उत्तर के लिए धन्यवाद।मैंने रेंडर प्रक्रिया के बाद लेआउट व्यू के भीतर सबव्यूज़ को कॉल करने के इस कार्यान्वयन के साथ खेलना शुरू किया। आप इस धारणा में सही हैं कि विभिन्न सबव्यूज़ का अपना प्रस्तुतिकरण है, जो मॉडल परिवर्तन राज्यों पर अपडेट किए जाते हैं। कुछ विचित्र कारणों के लिए हालांकि यह मेरे fetch के बाद लग रहा था, कुछ प्रतिपादन कॉल कई बार कहा जा रहा था। मुझे यह सोचने के लिए प्रेरित करना कि मैं कई बार विभिन्न सबव्यूव्स को अक्षमता से जोड़ रहा था। मुझे लगता है कि मुझे अपने डेटा को लाने के बाद कई रेंडर कॉल के कारण और क्या हो सकता है, यह ट्रैक करना पड़ सकता है। फिर से धन्यवाद! – aztechy

+0

इस मदद से खुशी हुई - मुझे अक्सर पता चलता है कि मुझे केवल एक सबव्यूव को तुरंत चालू करने के लिए तर्क की आवश्यकता है, अगर पहले से लोड नहीं किया गया हो, तो यह समस्या हो सकती है। (बीटीडब्ल्यू, अगर आपको उत्तर पसंद है, तो आप बाईं ओर चेकमार्क मारकर इसे स्वीकृति दे सकते हैं :) – nrabinowitz

+0

सही, सबव्यू को तुरंत चालू करने के लिए तर्क बनाना आवश्यक है। दुर्भाग्य से मैं एक ऐसे मुद्दे पर चल रहा हूं जिससे लेआउट View.render() के भीतर सबव्यूज़ को तुरंत चालू किया जा रहा है, जो उपक्रमों का कारण बनता है जो कि मॉडल प्रारंभिक घटनाओं में महत्वपूर्ण है, जो उनके प्रारंभिक सेटअप में परिभाषित किया गया है, ठीक से प्रस्तुत नहीं किया जा सकता है। मुख्य रूप से उस मामले में जहां दृश्य की मॉडल स्थिति नेविगेशन में समान रहता है, उपर्युक्त प्रक्रिया के कारण उस विशेष सबव्यू को खाली टेम्पलेट के साथ ओवरराइट किया जाता है। मुझे लगता है कि इस घटना तर्क को फिर से काम करने की आवश्यकता हो सकती है। – aztechy

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