2012-07-16 12 views
11

मेरे पास एक रीढ़ की हड्डी संग्रह है जो एक तालिका में प्रस्तुत किया जाता है। मैं "task_status", "task_group" जैसे कुछ विशेषताओं के आधार पर टेबल क्रमबद्ध करना चाहता हूं। मैं collection.comparator, nd collection.sort के बारे में रीढ़ की हड्डी दस्तावेज पढ़ रहा हूं। मैं यह कैसे कर सकता हूं?मॉडल विशेषताओं के आधार पर रीढ़ की हड्डी संग्रह

उत्तर

29

comparator फ़ंक्शन का उपयोग संग्रह में दो मॉडल की तुलना करने के लिए किया जाता है और यह उनकी तुलना किसी भी (लगातार) तरीके से तुलना कर सकता है। विशेष रूप से, यह चुन सकते हैं कि कौन सा मॉडल तो उपयोग करने के लिए श्रेय आप अपने संग्रह में कुछ इस तरह हो सकता है:

initialize: function() { 
    this.sort_key = 'id'; 
}, 
comparator: function(a, b) { 
    // Assuming that the sort_key values can be compared with '>' and '<', 
    // modifying this to account for extra processing on the sort_key model 
    // attributes is fairly straight forward. 
    a = a.get(this.sort_key); 
    b = b.get(this.sort_key); 
    return a > b ? 1 
     : a < b ? -1 
     :   0; 
}  

और फिर तुम सिर्फ संग्रह पर कुछ तरीकों की जरूरत है sort_key बदल सकते हैं और कॉल करने के लिए sort:

sort_by_thing: function() { 
    this.sort_key = 'thing'; 
    this.sort(); 
} 

पुराने बैकबोन में, sort पर कॉल करने से "reset" ईवेंट ट्रिगर होगा जबकि नए संस्करण "sort" ईवेंट ट्रिगर करेंगे। दोनों ही मामलों तुम दोनों घटनाओं को सुनने और कर सकते हैं कवर करने के लिए फिर से प्रस्तुत करना:

// in the view... 
initialize: function() { 
    this.collection.on('reset sort', this.render, this); 
} 

डेमो: http://jsfiddle.net/ambiguous/7y9CC/

तुम भी on के बजाय listenTo का उपयोग मदद से आप लाश से बच सकते हैं:

initialize: function() { 
    this.listenTo(this.collection, 'reset sort', this.render); 
} 

डेमो: http://jsfiddle.net/ambiguous/nG6EJ/

+0

मैं एक स्थिति है जहाँ तरह खेतों तार – MrFoh

+0

@MrFoh हैं में इस पद्धति का उपयोग कर सकते तारों पर, डेमो में 's' विशेषता एक स्ट्रिंग है। –

+1

नोट करें कि यह उदाहरण अब काम नहीं करता है क्योंकि बैकबोन अब रीसेट ईवेंट को सॉर्ट नहीं करता है। यह सॉर्ट घटना को आग लगती है। –

20

@ mu-is-too-short का जवाब अच्छा है, सिवाय इसके कि फ़ील्ड की तुलना करने का एक आसान तरीका है मूल्य:

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

तो संक्षेप में, आपको एक जटिल तुलनित्र कार्य प्रदान करने की आवश्यकता नहीं है, जब तक कि आपके पास आदेश निर्धारित करने के लिए अधिक उन्नत आवश्यकता न हो।

var myCollection = Backbone.Collection.extend({ 
    sort_key: 'id', // default sort key 
    comparator: function(item) { 
     return item.get(this.sort_key); 
    }, 
    sortByField: function(fieldName) { 
     this.sort_key = fieldName; 
     this.sort(); 
    } 
}); 

इस के बाद आप सिर्फ एक स्ट्रिंग है महत्वपूर्ण यह है कि आप क्रमित करना चाहते हैं का प्रतिनिधित्व करता है के साथ संग्रह के sortByField समारोह कॉल कर सकते हैं। उदाहरण के लिए:

collection.sortByField('name'); 

संशोधित @ मेरी-है के लिए भी कम के डेमो: http://jsfiddle.net/NTez2/39/

+1

नोट करें कि यह उदाहरण अब काम नहीं करता है क्योंकि बैकबोन अब रीसेट ईवेंट को सॉर्ट नहीं करता है। यह सॉर्ट घटना को आग लगती है। –

+1

सिर के लिए धन्यवाद! मैंने उस परिवर्तन को समायोजित करने के लिए उदाहरण अपडेट किया: http://jsfiddle.net/NTez2/39/ – jylauril

+1

एकल तर्क तुलनित्र (और '_.sortBy') के साथ बड़ी समस्या यह है कि आप आरोही और अवरोही क्रम के बीच स्विच नहीं कर सकते किसी भी फैशन फैशन में एक स्ट्रिंग पर। संख्याओं पर उतरना आसान है क्योंकि आप संख्याओं को अस्वीकार कर सकते हैं लेकिन स्ट्रिंग को अस्वीकार करना इतना आसान नहीं है। आप उन्हें एक ही स्ट्रिंग में मैश किए बिना कई कुंजियों द्वारा सॉर्ट नहीं कर सकते हैं और यह सही होने के लिए सावधानी बरतता है। –

3

@ jylauril का जवाब काफी मदद मिलती है, लेकिन डेमो (रीढ़ की हड्डी में शायद मामूली परिवर्तन को संशोधित करने की जरूरत है, क्योंकि यह पोस्ट किया गया ?)

ऐसा लगता है कि आपको सॉर्ट करने के बाद रेंडर ट्रिगर करने की आवश्यकता है।

$('#by-s').click(function() { 
    c.sortByField('s'); 
    v.render(); 
}); 

Updated @ मेरी-है के लिए भी कम के डेमो: हाँ, `>` और `<` काम: http://jsfiddle.net/NTez2/13/

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