2012-06-10 18 views
8

में हटाए गए दृश्य को दोबारा बनाने के लिए रीढ़ की हड्डी में View.remove() फ़ंक्शन स्वयं को हटाए गए विचारों को पुनर्निर्मित करने से रोकने वाले डोम से दृश्य के कंटेनर तत्व को हटा देता है। किसी भी विचार कैसे इस परिदृश्यरीढ़ की हड्डी जेएस

यहाँ मेरी कोड है नियंत्रित किया जाता है,

var AttributeView = Backbone.View.extend({ 
     el: $("#attrs"), 
     template:_.template($('#attrs-template').html()), 

     initialize:function() { 
     }, 


     render:function (eventName) { 
      $(this.el).html(this.template(this.model.toJSON())); 
      return this; 
      }, 

     dispose:function(eventName){ 
      this.unbind(); 
      this.remove(); 
     }, 

    }); 


var attrView = new AttributeView(); 
.... 
attrView.dispose(); 
//Later on some event I do the below 
attrView = new AttributeView() 
attrView.render(); 

अंतिम दो पंक्तियों से ऊपर आईडी = "attrs" के साथ div के रूप में देखने के पुन: नहीं है अब वहाँ नहीं है।

उत्तर

21

सबसे पहले, आप अपने dispose विधि की जरूरत नहीं है, मानक remove पर्याप्त है:

var attrView = new AttributeView(); 
//.... 
attrView.remove(); // <--------- Do this instead 
//... 
attrView = new AttributeView() 
attrView.render(); 

दूसरे, आप remove ओवरराइड कर सकते हैं, तो मानक संस्करण आपको क्या चाहिए नहीं करता है। default implementation बस this.el दूर करता है और कुछ घटना श्रोताओं को साफ:

remove: function() { 
    this.$el.remove(); 
    this.stopListening(); 
    return this; 
}, 

आपके मामले में, आप सब कुछ है कि render करता है और किthis.el अंदर एचटीएमएल बाहर समाशोधन और undelegateEvents फोन करके घटनाओं को निकालना है, पूर्ववत करना चाहते हैं:

remove: function() { 
    this.undelegateEvents(); 
    this.$el.empty(); 
    this.stopListening(); 
    return this; 
}, 

तो फिर तुम attrView.remove() फोन और इसे बंद को मारने और (new AttributeView()).render() इसे वापस लाने के कर सकते हैं।

डेमो: http://jsfiddle.net/ambiguous/Pu9a2/3/

+0

आपके उत्तर के लिए धन्यवाद। लेकिन किसी कारण से आपके उदाहरण के समान कोड काम नहीं करता है। मैंने अपनी समस्या का वर्णन करने के लिए http://jsfiddle.net/EnVmN/7/ बनाया है। कोई आइडिया है कि मैं क्या गलत कर रहा हूँ। मैं आपके एट्रिब्यूट व्यू का पुन: उपयोग कर रहा हूं लेकिन आइटमव्यू जोड़ा गया है और संपादन के क्लिक पर एट्रिब्यूटव्यू को दिखाने और हटाने की कोशिश कर रहा हूं और क्रमशः आइकन हटाएं। – mzafer

+0

@mzafer: एक दृश्य की घटनाएं केवल दृश्य के 'एल' और उसके बच्चों पर काम करती हैं, आपका आइटम व्यू '# आइटम' में प्रस्तुत हो रहा था लेकिन यह आइटमव्यू का 'एल' नहीं था इसलिए आपके आइकन पर क्लिक ईवेंट नहीं भेजे जा रहे थे ItemView: http://jsfiddle.net/ambiguous/KjC6x/ –

+0

बहुत धन्यवाद, यह अब काम करता है :) इस पर लगभग दो दिन बिताएं। – mzafer

0

के लिए रीढ़ दृश्य LayoutManager पर एक नज़र है, जो समझता है कि जब आप एक दृश्य को दूर ले लो (मूल - रोकथाम अर्थ में वस्तु पदानुक्रम भावना और नहीं), अपने subviews भी हटा दिया जाना चाहिए।

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