2012-03-19 16 views
7

मैं सर्वर पर घटनाओं की सदस्यता लेने के लिए एक सिग्नलर हब का उपयोग कर रहा हूं। एक हब में एक घटना भेजी जाती है, जिसने आइटम को मैरिएनेट कलेक्शन व्यू में सफलतापूर्वक जोड़ दिया है। यह बदले में, एक टेबल में प्रस्तुत किया जाता है।बैकबोन रिवर्स ऑर्डर में संग्रह प्रस्तुत कर सकता है?

क्योंकि घटनाओं की मेज अनिवार्य रूप से एक चूसक है, मैं उलटे क्रम में घटनाओं चाहते हैं और अच्छा होगा यदि केवल घटनाओं के एन-नंबर रखने के लिए।

क्या बैकबोन 'स्वचालित रूप से' रिवर्स ऑर्डर में संग्रह को फिर से प्रस्तुत कर सकता है?

उत्तर

1

आमतौर पर आप अपने Backbone.View 'उपवर्ग' में प्रतिपादन जगह ले होगा। तो अगर आप की तरह कुछ है:

render: function() { 
    this.collection.each(function(model) { 
    // some rendering of each element 
    }, this); 
} 

this.collection शायद एक Backbone.Collection उपवर्ग है, और इसलिए आप सिर्फ उस पर underscore.js methods भी क्रम का उपयोग करना चाहें में इसे पाने के लिए कर सकते हैं:

this.collection.reverse().each(...) 
this.collection.sort(function(m) { ... }).each(...) 

आदि

बेशक, आपको अपने बैकएंड से एक ही तत्व मिल रहा है, और आप पूरी चीज़ को फिर से प्रस्तुत किए बिना इसे सही जगह पर डालना चाहते हैं! तो उस मामले में सिर्फ पुराने स्कूल जाने के लिए और एक rel विशेषता या तत्वों पर data विशेषता के रूप में अपनी तरह कुंजी डालें, और insertAfter करने के लिए उपयोग कि या अपने renderNewItem (या समान) विधि में jQuery के साथ इसी तरह।

+2

दुर्भाग्यवश underscore.js विधियों में कोई रिवर्स() - विधि उपलब्ध नहीं है। – hbruce

+0

हाहा अच्छा बिंदु! वास्तव में मेरे जवाब का आधारशिला नहीं है, हालांकि। आप एक अलग दृष्टिकोण का उपयोग कर इसे उलट सकते हैं: '_.each (_.toArray (this.collection) .reverse(), फ़ंक्शन (एम) {...});'। या यदि आप कॉफ़ीस्क्रिप्ट का उपयोग कर रहे थे तो आप केवल एक चरण के साथ लूप के लिए लिख सकते हैं, आदि – rfunduk

1

बैकबोन स्वचालित रूप से क्रमबद्ध क्रम में संग्रह रखता है। यदि आप एक गैर-डिफ़ॉल्ट प्रकार का उपयोग करना चाहते हैं, तो अपने संग्रह पर comparator() फ़ंक्शन को परिभाषित करें और इसके बजाय इसका उपयोग किया जाएगा। तुलनित्र विवरण के लिए या तो एक या दो तर्क ले सकते हैं, see the Backbone documentation

फिर आप एक चाहते प्रत्येक() पाश में अपने संग्रह प्रदान कर सकते हैं, और यह सही क्रम में बाहर आ जाएगा। क्रमबद्ध क्रम में दृश्य में नए आइटम जोड़ना आपके ऊपर है, हालांकि।

+0

दिरा, अच्छा बिंदु, जो इसे आसान बनाता है। लेकिन आखिरकार आपको उन्हें सही स्थान पर डीओएम में ले जाना होगा। –

+1

हाँ, इसलिए आप jquery के nth-child का उपयोग करते हैं और() या इससे पहले() – dira

1

जो आप वर्णन करते हैं, उससे आपको रिवर्स ऑर्डर में संग्रह को फिर से प्रस्तुत करने की आवश्यकता नहीं है। उस दृश्य में अपने संग्रह पर बस add के लिए एक ईवेंट जोड़ें और इसे एक फ़ंक्शन कॉल करें जो आइटम को अभी जोड़ा गया है और इसे तालिका में प्रस्तुत करता है।

this.collection.on('add', this.addItem); 
8

वहाँ https://github.com/marionettejs/backbone.marionette/issues/78

में इस विषय पर एक धागा हालांकि रीढ़ एक बार आप एक तुलनित्र परिभाषित संग्रह सॉर्ट किया, के रूप में @breischl ने बताया रहता है, कठपुतली नहीं स्वचालित रूप से CollectionView जब आदेश परिवर्तनों को पुनः प्रस्तुत करना है । वास्तव में, मैरियनेट संग्रह पर add ईवेंट सुनता है और एक नया आइटम दृश्य जोड़ता है।

आप अपने CollectionView हमेशा रिवर्स कालानुक्रमिक क्रम में आइटम प्रदर्शित करना चाहते हैं, और आप चाहते हैं नए आइटम prepended बजाय संलग्न, तो अपने CollectionView में appendHtml विधि ओवरराइड इस प्रकार होना करने के लिए जोड़ा है:

var MyCollectionView = Backbone.Marionette.CollectionView.extend({ 
    appendHtml: function(collectionView, itemView){ 
    collectionView.$el.prepend(itemView.el); 
    } 
}); 

यदि आप टिप्पणी में उल्लिखित @ डीरा के रूप में किसी विशेष स्थान पर सम्मिलित करने में सक्षम होना चाहते हैं, तो सब्बरमैन द्वारा जिथब पर उपरोक्त लिंक पर एक समाधान पोस्ट किया गया है जिसे मैं सुविधा के लिए यहां पुन: पेश करता हूं (अस्वीकरण: मैंने परीक्षण नहीं किया है व्यक्तिगत रूप से नीचे कोड):

appendHtml बदलें:

appendHtml: function(collectionView, itemView) { 
    var itemIndex; 
    itemIndex = collectionView.collection.indexOf(itemView.model); 
    return collectionView.$el.insertAt(itemIndex, itemView.$el); 
} 

और जोड़ने jQuery का विस्तार करने के insertAt समारोह प्रदान करने के लिए निम्नलिखित:

(function($) { 
    return jQuery.fn.insertAt = function(index, element) { 
    var lastIndex; 
    if (index <= 0) return this.prepend(element); 
    lastIndex = this.children().size(); 
    if (index >= lastIndex) return this.append(element); 
    return $(this.children()[index - 1]).after(element); 
    }; 
})(jQuery); 
+1

ध्यान दें कि मैरियनेट 2.x में, appendHtml को HTML में संलग्न किया गया था। उम्मीद है कि दूसरों की मदद करता है! यह वही था जो मुझे अपने वेब ऐप में अन्य तर्क के ऑर्डर को गड़बड़ किए बिना रिवर्स ऑर्डर में संग्रह को प्रदर्शित करने के लिए आवश्यक था – mix3d

11

उलटे क्रम मैं आमतौर पर इस तरह की एक निर्माण का उपयोग में संग्रह के माध्यम से जाने के लिए:

_.each(collection.last(collection.length).reverse(), function(model){ }); 
0

आप अपने मॉडल को संग्रह में बदल सकते हैं जैसे इसलिए ...

this.collection.models = this.collection.models.reverse() 
0

आप lodash अंडरस्कोर के बजाय का उपयोग करते हैं तो आप भी ऐसा कर सकते हैं:

_(view.collection.models).reverse(); 
0

के रूप में रीढ़ की हड्डी के संग्रह के पिछली यात्रा का समर्थन नहीं करता (और यह सिर्फ संसाधनों की बर्बादी है संग्रह को उलट या बदतर करने के लिए) सबसे आसान और तेज़ तरीका संग्रह में मॉडल पर घटते सूचकांक के साथ for लूप का उपयोग करना है।

for (var i = collection.length - 1; i >= 0; i--) { 
    var model = collection.models[i]; 

    // your logic 
} 

ऐसा नहीं है कि छँटाई या संग्रह अंडरस्कोर का उपयोग कर पीछे के रूप में सुंदर नहीं है, लेकिन performace काफी बेहतर है। अलग-अलग loops here की तुलना करने के लिए बस क्लासिक के बजाय फ़ोरैच लिखने के लिए आपको कितना खर्च करना है, इसकी तुलना करने का प्रयास करें।

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