2013-08-09 9 views
5

सरल प्रश्न: किसी ईवेंट को 'केवल एक बार' आग लगाने का सबसे अच्छा तरीका क्या है?बैकबोन: एक संग्रह 'परिवर्तन' पर केवल एक बार फायरिंग

मेरे पास कई मॉडलों के साथ रीढ़ की हड्डी में संग्रह है। कभी-कभी कई मॉडल 'विशेषताओं को एक बार में अद्यतन किया जाता है, संग्रह पर कई' परिवर्तन 'घटनाओं को फायर किया जाता है।

सभी परिवर्तनों को एक साथ जोड़कर, केवल एक बार 'परिवर्तन' ईवेंट को आग लगाने का सबसे अच्छा तरीका क्या है?

इस समय मेरा सबसे अच्छा विचार टाइमर का उपयोग कर रहा है लेकिन यह केवल पहले मॉडल विशेषता परिवर्तन को कैप्चर करेगा।

सभी सुझाव, विचार और समाधान मूल्यवान हैं। धन्यवाद :)।


प्रसंग: इस मामले में घटना एक बहुत कंप्यूटेशनल रूप से संवेदनशील समारोह आग, इसलिए कई रन से परहेज किया जाना चाहिए।

उत्तर

4

आप थोक में मॉडल पर गुण अद्यतन कर रहे हैं जब भी, एक विकल्प है, जो will suppress any events from being fired.

फिर ट्रिगर एक कस्टम ईवेंट जिसके लिए एक दृश्य या एक से अधिक बार देखा गया एक ही को सुनने के {silent:true} गुजरती हैं।

+3

यह एक कामकाज है, सही समाधान नहीं है। 'Add' के बजाय 'रीसेट' का उपयोग करने का एक बेहतर समाधान होगा। एक एकल 'रीसेट' घटना कहा जाएगा। –

2

आप कर सकते हैं "debounce" अपने संग्रह में विधि की घटनाओं को बदलने के लिए है, हालांकि आप मैन्युअल रूप से यह पता लगाने की जो मॉडल बदल होगा जवाब देता है कि:

Col = Backbone.Collection.extend({ 
    modelChanged: _.debounce(function() { 
     // handle model changes 
    }, delayInMs), 
    initialize: function() { 
     this.collection.on('change', this.modelChanged, this); 
    } 
}) 
2

आप संग्रह को रीसेट करने के बजाय जोड़ने की कोशिश कर सकते हैं अवयव। Collection reset method description देखें:

रीसेटcollection.reset([models], [options])

एक समय में जोड़ा जा रहा है और मॉडलों निकालने से सब कुछ ठीक है और अच्छा है, लेकिन कभी कभी आप इतने सारे मॉडल है कि आप केवल में संग्रह को अद्यतन करता हूँ बदलना होगा थोक। मॉडल की एक नई सूची (या विशेषता हैश) के साथ संग्रह को प्रतिस्थापित करने के लिए रीसेट करें, अंत में एक "रीसेट" ईवेंट ट्रिगर करें। नए सेट मॉडल लौटाता है। सुविधा के लिए, "रीसेट" ईवेंट के भीतर, किसी भी पिछले मॉडल की सूची विकल्प.previousModels के रूप में उपलब्ध है।

प्रलेखन के रूप में कहते हैं, अगर आप reset उपयोग करते हैं, add के बजाय आप अंत में एक भी reset घटना मिल जाएगा।

+1

याद रखें कि संग्रह पर 'fetch() 'अभी भी प्रत्येक मॉडल के लिए परिवर्तन घटनाएं उत्पन्न करेगा, जब तक कि आप विकल्पों में' {reset: true}' में पास न हों। – mix3d

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