2011-08-03 15 views
9

मैं एक Backbone.js संग्रह है और मैं मॉडल आईडी कि मैं इसे पॉप्युलेट करने के लिए चाहता हूँ की एक सरणी है। मुझे पता है कि मैं इन वस्तुओं को एक-एक करके ला सकता हूं, वस्तुओं की एक सरणी बना सकता हूं और उन्हें संग्रह के कन्स्ट्रक्टर में सरणी के रूप में पास कर सकता हूं।क्या वस्तुओं के बजाए ऑब्जेक्ट आईडी के साथ रीढ़ की हड्डी संग्रह शुरू करना संभव है?

मैं जो करना चाहता हूं वह प्रारंभिक डेटा के रूप में कन्स्ट्रक्टर में ऑब्जेक्ट आईडी की सरणी पास कर लेता है, और उन्हें this के अनुसार, संभवतः बैच के रूप में लाने के लिए संग्रह प्राप्त करना है।

साध्य?

उत्तर

10

जब आप बारी में एक Backbone.Collection पर 'लाने', इसे कहते Backbone.sync, जो डिफ़ॉल्ट रूप से सिर्फ यूआरएल का उपयोग करने के लिए संग्रह पूछता कहता है।

/models/batch/?ids=1,2,3,4 
कुछ

आप कर सकता है जैसे:

var MyCollection = Backbone.Collection.extend({ 

    model: Model, 

    url: '/models', 

    initialize: function(models, options) { 
     ids = options.ids || []; 
     if (ids.length > 0) { 
      this.fetchByIds(ids); 
     } 
    }, 

    fetchByIds: function(ids) { 
     // Save a reference to the existing url 
     var baseUrl = this.url; 

     // Assign our batch url to the 'url' property and call the server 
     this.url += '/?ids=' + ids.join(','); 
     this.fetch(); 

     // Restore the 'url' property 
     this.url = baseUrl; 
    } 
}); 

और इसलिए की तरह उपयोग:

var coll = new MyCollection({}, {ids: [1, 2, 3, 4]}); 

उत्तीर्ण होने के लिए होगा

तो अपने सर्वर का जवाब है, तो विकल्प पैरामीटर में आईडी, क्योंकि बैकबोन। चयन कन्स्ट्रक्टर फ़ंक्शन पहले पैरामीटर में पारित मॉडल सेट करता है यह 'प्रारंभिक' फ़ंक्शन को कॉल करता है।

सैद्धांतिक रूप से, यह (: पूरी तरह से अपरीक्षित पढ़ें) काम करना चाहिए।

+0

बहुत बहुत धन्यवाद, मैं इसे जाने दूंगा – Joe

3

आप वास्तव में भी एक समारोह के लिए url सेट कर सकते हैं। मैं सिर्फ fetchByIds के बजाय लाने ओवरराइड चाहते हैं: इसके अलावा, मुझे लगता है कि baseurl मॉडल केवल, नहीं संग्रह के लिए है। मुझे लगता है कि rulfzid सही विचार है, लेकिन मुझे लगता है कि मैं इसे इतना पसंद करते हैं चाहते हैं:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 

    initialize: function(models, opts) { 
    if (options.ids) { 
     this.fetch(options.ids); 
    } 
    }, 

    url: function() { 
    var url = ''; 
    if (this.fetch_ids) { 
     // pass ids as you would a multi-select so the server will parse them into 
     // a list for you. if it's rails you'd do: id[]= 
     url = '/models?id=' + ids.join('&id='); 
     // clear out send_ids 
     this.fetch_ids = undefined; 
    } else { 
     url = '/models'; 
    } 
    return url; 
    }, 

    fetch: function(args) { 
    if (args.ids) { 
     this.fetch_ids = args.ids; 
    } 
    return Backbone.Model.prototype.fetch.call(this, args); 
    } 
}); 

मुझे लगता है कि यह उचित 'जगह' में कार्यक्षमता रहता है, और इसे और अधिक पुनर्प्रयोग (यानी, आप प्राप्त कर सके की अनुमति देता है (list_of_ids) किसी भी समय ... आपको एक नई वस्तु की आवश्यकता नहीं है)

7

प्रारंभिक पृष्ठ लोड पर, आपको fetch का उपयोग नहीं करना चाहिए - इसे reset का उपयोग करके बूटस्ट्रैप किया जाना चाहिए: http://documentcloud.github.com/backbone/#FAQ-bootstrap

लिंक से:

लोड हो रहा है बूटस्ट्रैप मॉडल

जब आपके एप्लिकेशन पहली बार लोड, यह प्रारंभिक मॉडल क्या आप जानते हैं कि आप की आवश्यकता के लिए जा रहे का एक सेट है आम है क्रम में प्रस्तुत करना पन्ना। उन्हें लाने के लिए एक अतिरिक्त AJAX अनुरोध को फायर करने के बजाय, एक अच्छा पैटर्न है कि उनका डेटा पहले से ही पृष्ठ में बूटस्ट्रैप हो। फिर आप प्रारंभिक डेटा के साथ अपने संग्रह को पॉप्युलेट करने के लिए रीसेट का उपयोग कर सकते हैं। DocumentCloud पर, वर्कस्पेस के लिए ईआरबी टेम्पलेट में, हम इन पंक्तियों के साथ कुछ करते हैं:

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
    Projects.reset(<%= @projects.to_json(:collaborators => true) %>); 
</script> 
संबंधित मुद्दे