2012-07-16 15 views
10

मैं एक संग्रह पर अंडरस्कोर विधि 'खोज' का उपयोग करने की कोशिश कर रहा हूँ, लेकिन यह मेरे परिणाम मैं उम्मीद न जताए पर अंडरस्कोर विधि 'खोज' का उपयोग करना:एक रीढ़ संग्रह

मुझे कोई साथ एक बेस मॉडल है डिफ़ॉल्ट, और एक डिफ़ॉल्ट संग्रह। मेरे संग्रह में मॉडल में केवल दो विशेषताएं हैं: tranId (एक स्ट्रिंग के रूप में एक guid), और प्रदर्शन (प्रदर्शन करने के लिए एक समारोह)।

मैं संग्रह है कि tranId है कि मैं इसे पारित मैचों में आइटम खोजने की कोशिश कर रहा हूँ ...

var tranId = "1a2b3c"; 

    var found = _.find(myCollection, function(item){ 
     return item.tranId === tranId; 
    }); 

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

var found = _.find(myCollection, function(item){ 
     return item.get('tranId') === tranId; 
    }); 

लेकिन, वही बात। 'पाया' हमेशा अपरिभाषित है। मुझसे यहां क्या गलत हो रहा है?

उत्तर

20

बैकबोन संग्रह many of the Underscore functions लागू करता है, तो आप ऐसा कर सकते हैं:

var found = myCollection.find(function(item){ 
     return Number(item.get('tranId')) === tranId; 
}); 

इसके अलावा डिबग करने के लिए करता है, तो मान क्या तुम कोशिश की उम्मीद नहीं कर रहे हैं:

var found = myCollection.find(function(item){ 
     console.log('Checking values', item, item.get('tranId'), tranId); 
     return Number(item.get('tranId')) === tranId; 
}); 
+0

धन्यवाद, यह काम किया। अंडरस्कोर विधि उसी तरह क्यों काम नहीं करती है? यह भी ध्यान दिया जाना चाहिए कि tranId एक स्ट्रिंग है, संख्या नहीं। तो, टाइपकास्टिंग की आवश्यकता नहीं है। –

+2

@ जोएलडॉइडॉयले अगर आप सीधे अंडरस्कोर विधियों का उपयोग करना चाहते हैं तो मेरे कोलेक्शन.मोडल्स का उपयोग करना बेहतर हो सकता है क्योंकि यह आपके मॉडल का कच्चा ऐरे है http://backbonejs.org/#Collection-models - टाइपकास्ट ऐसा था कि वहां था सख्त डेटाटाइपिंग तुलना के साथ मुद्दों। : डी –

+0

कूल। आपको बहुत - बहुत धन्यवाद! –

5

एक संग्रह बिल्कुल एक ही मतलब यह नहीं है बैकबोन में चीज (मॉडल की सूची प्रबंधित करने वाली वस्तु) और अंडरस्कोर (ऑब्जेक्ट्स की एक सूची)। क्या आप _.find को पास करना चाहिए myCollection.models

_.find(myCollection.models, function(model) { 
    return model.get('tranId')===tranId; 
}); 

है @Daniel Aranda बताया गया है, रीढ़ प्रॉक्सी Underscore methods on collections और आप के रूप

myCollection.find(function(model) { 
    return model.get('tranId')===tranId; 
}); 

अंत में अपने उदाहरण लिख सकता है, अगर tranId अपने मॉडल आईडी, आप कर सकते थे set id as the idAttribute है और get

var M=Backbone.Model.extend({ 
    idAttribute: "tranId" 
}); 
var C=Backbone.Collection.extend({ 
    model:M 
}); 

var myCollection=new C([ 
    {tranId:'not this one'} , 
    {tranId:'another'} , 
    {tranId:'1a2b3c'} 
]); 

myCollection.get(tranId); 

का उपयोग करके पूरी चीज़ को सरल बनाएं और एक फिडल http://jsfiddle.net/rYPLU/

+0

उत्कृष्ट। धन्यवाद! –

+0

बहुत उपयोगी, धन्यवाद! बस एक तरफ टिप्पणी के रूप में याद रखें कि बैकबोन मॉडल का डिफ़ॉल्ट 'idAttribute'' आईडी' फ़ील्ड है, [दस्तावेज़ पढ़ें] (http://backbonejs.org/#Model-idAttribute) अधिक जानकारी के लिए – enricostn

10

एक और अधिक सरल एक:

var found = myCollection.findWhere({'tranId': tranId}) 

जानकारी के लिए here देखें।

आप अंडरस्कोर विधि उपयोग करना आवश्यक है:

var found = _.find(myCollection.models, function(item){ 
    return item.get('tranId') === tranId; 
}); 

क्योंकि myCollection.models एक सरणी, नहीं myCollection है।

मैं पूर्व को पसंद करता हूं।

+0

बहुत अच्छा । मुझे एक लाइन समाधान पसंद है! –

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