2012-03-31 13 views
13

मेरे पास एक होमव्यू है जिसमें पृष्ठ पर कुछ सबव्यूव हैं, जब मैं राउटर का उपयोग करके किसी अन्य पृष्ठ पर नेविगेट करता हूं, मैं मौजूदा दृश्य कैसे साफ कर सकता हूं, और उस पृष्ठ के लिए नए दृश्य कैसे बना सकता हूं, जिसे मैं नेविगेट करना चाहता हूं?बैकबोन जेएस: किसी अन्य यूआरएल पर नेविगेट करते समय विचारों को कैसे साफ करें?

इस एप्लिकेशन में कोई मॉडल/संग्रह नहीं है, बस विचार।

धन्यवाद! कोड की

भाग:

Home = Backbone.View.extend({ 
    template: "static/js/templates/home.html", 

    initialize: function() { 
     _.bindAll(this); 
     this.render(); 
    }, 

    render: function() { 
     var view = this; 

     // Fetch the template, render it to the View element and call done. 
     namespace.fetchTemplate(this.template, function(tmpl) { 
     view.el.innerHTML=tmpl(); 
     view.subRender(); 
     }); 

     return this; 
    }, 
    subRender: function() { 
     var view = this; 
     var videoView = new Subview1({ 
     el: $('#wrapper1'), 
     homeView: view 
     }); 
     var timeView = new Subview2({ 
     el: $("#wrapper2") 
     }); 
    } 
}); 
+0

एक बेहतर समाधान लगता है। – user469652

उत्तर

9

यदि आप चाहें तो ऐसा करने के लिए आप शायद रीढ़ की हड्डी की घटनाओं का उपयोग कर सकते हैं।

आपको केवल वैश्विक ईवेंट राउटर बनाने की आवश्यकता होगी, और उसके बाद आपके प्रत्येक विचार CloseView ईवेंट के लिए सुनें। फिर आपको CloseView ईवेंट प्राप्त करने पर बस अपना पूरा शटडाउन करने की आवश्यकता है।

var dispatcher = _.clone(Backbone.Events) 

Home = Backbone.View.extend({ 
    ... 
    initialize: function() { 
     ... 
     dispatcher.on('CloseView', this.close, this); 
    } 
    close: function() { 
     // Unregister for event to stop memory leak 
     dispatcher.off('CloseView', this.close, this); 
     this.remove(); 
     this.unbind(); 
     this.views = []; // Clear the view array 
    } 
    ... 
}); 

SubView = Backbone.View.extend({ 
    ... 
    initialize: function() { 
     ... 
     dispatcher.on('CloseView', this.close, this); 
    } 
    close: function() { 
     // Unregister for event to stop memory leak 
     dispatcher.off('CloseView', this.close, this); 
     // Do other close stuff here. 
    } 
}); 

तो यह सिर्फ अपने रूटर/अन्य जगहों में dispatcher.trigger('OnClose') बुला करीब कार्यों को गति प्रदान करने का एक मामला है।

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

यह संभवतः इस कोड में से कुछ को बैकबोन.View.prototype या इसी तरह रीफैक्टर करना संभव होगा, लेकिन मैं इसे किसी और के लिए छोड़ दूंगा।

+0

मैंने अपनाया, और अब इसे पसंद किया। – user469652

+0

क्या मैं पूछ सकता हूं कि आप हर मार्ग पर ऐसा क्यों नहीं करेंगे? और आप विचारों को क्यों साफ़ कर रहे हैं []? – pushplaybang

+0

भी देखें। स्टॉप लिस्टिंग() स्पष्ट रूप से अब दृश्यमान रूप से स्वचालित रूप से कहा जाता है .remove - तो उपरोक्त अभी भी प्रासंगिक है? - कस्टम इवेंट विधियों को समझ में आता है, लेकिन अब अलग-अलग तरीके से निष्पादित किया जाना चाहिए? – pushplaybang

4

मैं एक सरणी में उप विचारों की दुकान और जब मैं एक "जनक" -View बंद दृश्य के close() समारोह के माध्यम से,, सरणी पर पुनरावृति और उप बंद देखा गया।

इसके लिए सबव्यू 1 और सबव्यू 2 की आवश्यकता है close() फ़ंक्शन भी।

Home = Backbone.View.extend({ 
    template: "static/js/templates/home.html", 

    initialize: function() { 
     _.bindAll(this); 
     this.render(); 
     // Hold sub views 
     this.views = []; 
    }, 
    close: function() { 
     this.remove(); 
     this.unbind(); 
     this.clear_views(); 
    }, 
    clear_views: function() { 
     while this.views.length > 0 
     this.views[0].close() 
     this.views.splice(0, 1) 
    }, 
    render: function() { 
     var view = this; 

     // Fetch the template, render it to the View element and call done. 
     namespace.fetchTemplate(this.template, function(tmpl) { 
     view.el.innerHTML=tmpl(); 
     view.subRender(); 
     }); 

     return this; 
    }, 
    subRender: function() { 
     var view = this; 
     var videoView = new Subview1({ 
     el: $('#wrapper1'), 
     homeView: view 
     }); 
     this.views.push(videoView); 
     var timeView = new Subview2({ 
     el: $("#wrapper2") 
     }); 
     this.views.push(timeView); 
    } 
}); 
+0

वैसे, धन्यवाद, हम पिछला() को Backbone.View.prototype में जोड़ सकते हैं। मैं वर्तमान में इसी तरह से ऐसा कर रहा हूं, लेकिन एक और अधिक सुरुचिपूर्ण समाधान की तलाश में हूं। – user469652

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