2012-05-24 14 views
5

यदि मेरे पास बैकबोन संग्रह है और कुछ प्रविष्टियों के साथ उस संग्रह की प्रतिलिपि बनाना चाहते हैं, तो कॉपी किए गए उदाहरण को बैकबोन के रूप में रखने के दौरान मैं यह कैसे कर सकता हूं। चयन?बैकबोन फ़िल्टरिंग

उदाहरण:

var Module = Backbone.Model.extend(); 

var ModuleCollection = Backbone.Collection.​extend({ 
    model: Module 
}); 

​var modules = new ModuleCollection; 

​modules.add({foo: 'foo'​​​​​​},{foo: 'bar'});​​​​​ 

console.log(modules instanceof Backbone.Collection); // true 

var filtered = modules.filter(function(module) { 
    return module.get('foo') == 'bar'; 
}); 

console.log(filtered instanceof Backbone.Collection); // false 

http://jsfiddle.net/m9eTY/

उपरोक्त उदाहरण में, मैं filtered मॉड्यूल की फ़िल्टर संस्करण, बस नहीं मॉडल की एक सरणी होना चाहते हैं।

अनिवार्य रूप से मैं संग्रह उदाहरण में एक विधि बनाना चाहता हूं जो कुछ मॉडलों को फ़िल्टर कर सकता है और Backbone.Collection उदाहरण वापस कर सकता है, लेकिन जैसे ही मैं पुनरावृत्ति विधियों को फ़िल्टर करना प्रारंभ करता हूं, एक सरणी देता है।

उत्तर

9

यदि आप चाहते हैं तो फ़िल्टर किए गए सरणी को अस्थायी मॉड्यूल कोलेक्शन में लपेट सकते हैं, तो मॉडल मॉड्यूल मूल मॉड्यूल कोलेक्शन में समान उदाहरण हैं, इसलिए यदि मॉड्यूल की विशेषता बदलती है, तो यह अभी भी दोनों संग्रहों द्वारा संदर्भित है।

तो क्या मैं सुझाव है कि आप क्या करना है कुछ की तरह:

var filtered = new ModuleCollection(modules.filter(function (module) { 
    return module.get('foo') == 'bar'; 
})); 

के बाद से रीढ़ 0.9.2 वहाँ एक अतिरिक्त विधि where कहा जाता है एक ही करता है जो:

var filtered = modules.where({foo: 'bar'}); 

है कि अभी भी एक सरणी देता है हालांकि, आपको अभी भी इसे इस तरह लपेटने की आवश्यकता होगी:

var filtered = new ModuleCollection(modules.where({foo: 'bar'})); 
+0

भावना बनाता है बनाने के लिए है लौटने। धन्यवाद! – David

0

फ़ाइल के लिए TERING संग्रह का उपयोग कर रीढ़ की हड्डी

फिल्टर आप अपने संग्रह में किसी फ़िल्टर किए गए समारोह होना चाहिए

var MyCollection = Backbone.Collection.extend ({ 
    filtered : function() { 

मैं अंडरस्कोर फिल्टर जो वैध और अवैध के लिए झूठे के लिए सच वापस आ जाएगी उपयोग करने के लिए सुझाव है कि बनाने के लिए जहां सच है कि तुम क्या कर रहे हैं खोज रहे हैं प्राप्त करने के लिए वर्तमान संग्रह मॉडल model.get ('') का उपयोग तत्व आप के लिए

var results = _.filter(this.models, function (model) {   
    if (model.get('foo') == 'bar') 
    return true ; 
    return false ; 
}); 

तो उपयोग अपने परिणामों को मैप और यह JSON को बदलने को रेखांकित जाँच करना चाहते हैं पाने के लिए this.models का उपयोग इस तरह probally जहां है आप हो रही है यह गलत

results = _.map(results, function(model) { return model.toJSON() }); 

अंत में केवल परिणाम के साथ एक नया रीढ़ संग्रह है कि यह कैसे एक प्रतिलिपि बनाई संग्रह

return new Backbone.Collection(results) ; 
संबंधित मुद्दे