2011-12-11 16 views
44

मैंने Backbone.js का उपयोग कर एक मॉडल/दृश्य/संग्रह लिखा है। मेरा संग्रह रिमोट सर्वर से मॉडल लोड करने के लिए fetch विधि का उपयोग करता है। इस संग्रह के लिए आवश्यक यूआरएल को एक आईडी की आवश्यकता है: संदेश/{आईडी}। लेकिन मुझे संग्रह में विकल्प पास करने का कोई साफ तरीका नहीं मिला है।Backbone.js संग्रह विकल्प

backbone.js देखें इसे निर्माण पर पास करके विकल्पों को स्वीकार करता है: देखें ([विकल्प]), लेकिन संग्रह निर्माण पर मॉडलों की एक सूची की अपेक्षा करता है: संग्रह ([मॉडल])।

इस संग्रह में पैरामीटर/विकल्पों को पारित करने का "सबसे साफ" तरीका क्या है?

छोटा कोड:

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

शायद सापेक्ष यूआरएल का उपयोग करना भी एक बेहतर विचार है? – malletjo

उत्तर

107

@ पॉल जवाब अच्छा है, लेकिन यह भी ध्यान देने योग्य है कि url विशेषता एक समारोह हो सकता है लायक है। मेरी राय में (और यह सिर्फ राय है, अंतिम परिणाम के बाद से ही है), कोड यदि अधिक वर्बोज़, एक छोटे से अधिक स्पष्ट है, तो आप initialize में आईडी की स्थापना की और यदि संदर्भ में यह एक समारोह में:

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    url: function() { 
    return '/messages/' + this.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 

बस यह सुनिश्चित करने के लिए, हालांकि - आप id को मॉडल id के साथ भ्रमित नहीं कर रहे हैं, है ना? @ पॉल का जवाब, और उपरोक्त मेरा कोड, मान लें कि आपके पास एकाधिक Messages संग्रह हैं, जिनमें से प्रत्येक अपनी आईडी के साथ है। यदि एपीआई पथ /messages/<id> वास्तव में संदेश को संदर्भित करता है, संदेशों का एक सेट नहीं है, तो आपको संग्रह में url/messages/ पर सेट करने की आवश्यकता है, और बैकबोन स्वचालित रूप से प्रत्येक मॉडल के लिए /messages/<id> का उपयोग करेगा।

+3

इस तरह के एक सरल और स्पष्ट उदाहरण के लिए 'निक' धन्यवाद। काश मैं तुम्हारा जवाब देख सकता था, मैं एक दिन बचा लेता .... धन्यवाद। – Shubh

+0

हां, यह मेरे लिए अपरिभाषित परिणाम है। नीचे जवाब काम करता है। –

23

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

बैकबोन। चयन अपने कन्स्ट्रक्टर में दूसरे तर्क के रूप में विकल्पों को स्वीकार करता है, ताकि आप आईडी मान को एक विकल्प के रूप में पास कर सकें और फिर संग्रह के प्रारंभिक कार्य के भीतर यूआरएल मान सेट कर सकें।

यहाँ एक उदाहरण है

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.url = 'http://url/messages/' + options.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 
संबंधित मुद्दे