2012-05-24 9 views
10

remove() विधि में undelegateEvents() पर कॉल करना एक बुरा अभ्यास है? रीढ़ की हड्डी में डिफ़ॉल्ट रूप से इसे क्यों शामिल नहीं किया गया था?दृश्य देखने के बाद घटनाओं को कम करने का सबसे अच्छा तरीका अब

मुझे एहसास हुआ कि मैं एक बहुत ही बाध्यकारी मुद्दों में पड़ रहा हूं, जब एक व्यू वैरिएबल को फिर से शुरू कर रहा हूं। हालांकि undelegateEvents() स्वचालित रूप से बुलाया जा रहा है जब कोई नया दृश्य बनाया जाता है, तो यह नए तत्काल दृश्य के लिए घटनाओं को कम करने की कोशिश कर रहा है, न कि पिछले। इसलिए, जब तक कि इसे हर बार मैन्युअल रूप से कॉल नहीं किया जाता है, भूत घटना कॉलबैक जीवित रहती है और मेरे ऐप्स को खराब कर देती है।

इसे संभालने का सबसे अच्छा तरीका क्या है?

+0

संबंधित? http://stackoverflow.com/questions/10429648/backbone-js-how-to-unbind-from-events-on-model-remove/10433015#10433015 – fguillen

+0

क्या आप दृश्यों को स्विच करते समय 'el' का पुनः उपयोग कर रहे हैं नए बना रहे हैं? JQuery 'प्रतिनिधि' दृश्य के 'el' से जुड़ा हुआ है। –

+0

@muistooshort हां, मैं बार-बार एक ही डोम कंटेनर का पुन: उपयोग करता हूं, और इसे हर बार एक नया बनाने और जोड़ने के बजाय इसे देखने के लिए देता हूं। यही कारण है कि भूत कॉलबैक को हटा देना महत्वपूर्ण महत्व है – preslavrachev

उत्तर

5

remove() विधि में undelegateEvents() पर कॉल करने का यह एक बुरा अभ्यास है?

यह आवश्यक नहीं है, जब तक कि आप अपने खुद के remove() लागू कर रहे हैं और आप Backbone.View.remove() या this.$el.remove() न बुलाया जाए। ऐसा है कि आप कम से कम jQuery का उपयोग कर रहे हैं। बैकबोन व्यू पर remove() पर कॉल करने से jQuery.remove() पर कॉल किया जाएगा जो सभी DOM ईवेंट श्रोताओं को वैसे भी हटा देगा।

मुझे एहसास हुआ कि मैं एक बहुत ही बाध्यकारी मुद्दों में पड़ रहा हूं, जब बस एक दृश्य चर को फिर से शुरू कर रहा हूं।

var View = Backbone.View.extend({ 

    initialize : function (options) { 

    // `on()` or `bind()` 

    this.model.on('something', this.render, this); 

    } 

}); 

Delegating events to a parent view in Backbone

पर मेरा उत्तर देखें:

लोगों का एक बहुत यह जैसे जादू किसी तरह का है कि वे के बाद साफ करने के लिए की जरूरत नहीं है, जैसे Backbone.Events उपयोग करने के लिए लग रहे हैं

क्या यह संभव है कि भूत घटना के मुद्दों को आप बैकबोन घटनाओं के साथ हैं और डीओएम घटनाओं के साथ नहीं हैं?

यदि आप मॉडल ऑब्जेक्ट को चारों ओर रखते हैं लेकिन उस व्यू ऑब्जेक्ट या इसके बैकबोन इवेंट रजिस्ट्रेशन से छुटकारा पाना चाहते हैं, तो आपको view.model.off(null, null, this); करना होगा। आपको उन घटनाओं को अनबिंड करना होगा जिन्हें आपने किसी बाहरी ऑब्जेक्ट पर पंजीकृत किया है। यदि आप चाहते हैं, तो आप Backbone.View.remove() को ओवरराइड कर सकते हैं और इसे वहां कर सकते हैं, लेकिन डिफ़ॉल्ट रूप से यह विधि view.$el.remove() के लिए केवल लघुरूप है।

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