Backbone.js में एक दृश्य को नष्ट या हटा दें


83

मैं वर्तमान में विचारों के लिए एक नष्ट / हटाने की विधि को लागू करने की कोशिश कर रहा हूं, लेकिन मुझे अपने सभी विचारों के लिए एक सामान्य समाधान नहीं मिल सकता है।

मैं उम्मीद कर रहा था कि नियंत्रक के साथ संलग्न होने के लिए एक घटना होगी, ताकि जब कोई नया अनुरोध इसके माध्यम से आए तो पहले के विचारों को नष्ट कर दे और फिर नए को लोड कर दे।

क्या प्रत्येक दृश्य के लिए एक निष्कासन फ़ंक्शन का निर्माण किए बिना ऐसा करने का कोई तरीका है?


क्या आप इस बात का उदाहरण दे सकते हैं कि आपका दृष्टिकोण इको-सिस्टम क्या है? आपका प्रश्न मुझे लगता है कि पृष्ठ पर एक ही बार में कई विचार हैं। मैं काफी कल्पना नहीं कर सकता कि आप क्या करने की कोशिश कर रहे हैं और इस तरह एक उत्तर की पेशकश नहीं कर सकते हैं जो आपको चाहिए।
बिल ईसेनहुअर

1
इन महान पदों से कुछ अन्य पैटर्न: Lostechies.com/derickbailey/2011/09/15/… coenraets.org/blog/2012/01/…
daedelus_j

जवाबों:


47

सारी जानकारी जाने बिना ... आप अपने मॉडल या नियंत्रक पर रीसेट ट्रिगर बांध सकते हैं:

this.bind("reset", this.updateView);

और जब आप विचारों को रीसेट करना चाहते हैं, तो एक रीसेट ट्रिगर करें।

अपने कॉलबैक के लिए, कुछ ऐसा करें:

updateView: function() {
  view.remove();
  view.render();
};

5
मुझे नहीं लगता कि यह सही है। व्यू का रिमूवल फंक्शन DOM से उस व्यू का एलिमेंट हटाता है ( यहाँ देखें )। मुझे लगता है कि यह आदमी पूरी तरह से ऑब्जेक्ट को हटाना चाहता है।
न्यूट्रीटिअवेटिम

2
this.remove () कॉल jQuery के रिमोट () है, जो भी डेटा और घटनाओं को हटा समाप्त होता है ... फिर भी मुझे लगता है कि तुम भी, अन्य घटनाओं से अनबाइंड करने के लिए this.undelegateEvents कॉल करने के लिए कस्टम घटनाओं या मॉडल में बदलाव की तरह है ..
खुलता है

21
this.remove()कॉल this.stopListening()और this.$el.remove()। पहले सभी ईवेंट श्रोताओं को जोड़कर निकालता है this.listenTo(...)। दूसरा jQuery का उपयोग करके सभी ईवेंट श्रोताओं को जोड़ देता है। जब तक आप घटना श्रोताओं को जोड़ने के कुछ अन्य साधनों का उपयोग नहीं करते, तब तक आप दोनों को कवर किया जाना चाहिए। तो यह उत्तर सही है और मुझसे +1 प्राप्त करता है।
चौबे

162

मुझे पूरा यकीन था कि दृश्य को केवल DOM से हटाया नहीं गया था, बल्कि घटनाओं से पूरी तरह से अनबाउंड भी था।

destroy_view: function() {

    // COMPLETELY UNBIND THE VIEW
    this.undelegateEvents();

    this.$el.removeData().unbind(); 

    // Remove view from DOM
    this.remove();  
    Backbone.View.prototype.remove.call(this);

}

मुझे overkill की तरह लगता है, लेकिन अन्य दृष्टिकोण पूरी तरह से चाल नहीं किया।


10
मैंने जो देखा है, उसके लिए यह .remove () को jQuery के निष्कासन को कॉल करना चाहिए, जो DOM से तत्व को निकालना चाहिए, लेकिन इसके साथ जुड़े डेटा और घटनाओं को भी हटा देना चाहिए। तो मुझे लगता है कि कॉल करने के लिए undelegateEvents और removeData आवश्यक नहीं होना चाहिए ... क्या मैं सही हूं?
खोलता है

1
DOM से हटाए जाने के बावजूद @opensas Events इस.remove () को पिछले बना रहा था। सभी घटनाओं को निष्पक्ष करने के लिए इस .undelegateEvents () की आवश्यकता थी। जैसा कि मैंने कहा, यह ओवरकिल की तरह लगा, लेकिन इसने चाल चली।
sdailey 18

3
मुझें यह पसंद है। आखिरकार आपको this.$elइसके बजाय प्रयोग करना चाहिए $(this.el);)
क्रेक

3
मेरी समस्या के अच्छे उत्तर के लिए +1, अपना पहला उत्तर लिखने के लिए +1 :)
1nfiniti

1
मेरा दृष्टिकोण फिर से इसे नष्ट करने और बनाने पर दोबारा नहीं मिल रहा है। क्या इसकी वजह है this.remove()?
राएसा

20

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन उम्मीद है कि यह किसी और के लिए उपयोगी होगा। यदि आप बैकबोन v0.9.9 + का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं, listenToऔरstopListening

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}

stopListeningस्वचालित रूप से कहा जाता है remove। आप यहाँ और यहाँ पढ़ सकते हैं


8

यह वही है जो मैं उपयोग कर रहा हूं। कोई समस्या नहीं देखी।

destroy: function(){
  this.remove();
  this.unbind();
}

4

वर्तमान बैकबोन प्रलेखन के अनुसार ...।

view.remove ()

DOM से एक दृश्य और उसके el को निकालता है, और किसी भी बाध्य ईवेंट को हटाने के लिए stopListening को कॉल करता है जो कि viewTo'd है।


0

मुझे लगता है कि यह काम करना चाहिए

destroyView : function () {
    this.$el.remove();
}

श्रोताओं को भी मारना है this.stopListening()और फिर return thisअच्छे उपाय के लिए
ब्रैंडन

0

आप समस्या को हल करने के तरीके का उपयोग कर सकते हैं!

initialize:function(){
    this.trigger('remove-compnents-cart');
    var _this = this;
    Backbone.View.prototype.on('remove-compnents-cart',function(){
        //Backbone.View.prototype.remove;
        Backbone.View.prototype.off();
        _this.undelegateEvents();
    })
}

दूसरा तरीका Another एक वैश्विक वैरिएबल बनाएं, जैसे:_global.routerList

initialize:function(){
    this.routerName = 'home';
    _global.routerList.push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
    Backbone.View.prototype.remove.call(_global.routerList[i]);
}

पहले दृष्टिकोण ने मेरे लिए काम किया, मैं भूतों के विचारों के साथ एक समान समस्या में भाग गया और जब आप फॉर्म जमा करते थे तो कई बार गोलीबारी हो रही थी जब प्रत्येक दृश्य को फिर से बनाया जा रहा था
ONYX
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.