2011-10-13 16 views
8

बैकबोन जेएस में जब मैं संग्रह प्राप्त करता हूं तो क्या मुझे पूरा संग्रह या उसका एक छोटा सा हिस्सा मिलना चाहिए?बैकबोनजेएस: संग्रह में अधिक आइटम लोड करें

उदाहरण के लिए मेरे पास mongoDB में समाचार फ़ीड संग्रह है जो संभावित रूप से आइटमों के 1000s में हो सकता है। जब उपयोगकर्ता पृष्ठ पर हिट करता है तो मैं केवल उन्हें 'लोड लोड' के विकल्प के साथ नवीनतम 10 आइटम दिखाना चाहता हूं। लेकिन अगर वे URL http://site.com/#/feed/:itemID के माध्यम से किसी विशिष्ट आइटम पर जाते हैं, तो मैं उस आइटम के रिकॉर्ड को खींचने में सक्षम होना चाहता हूं।

1. मुझे शुरुआत में कितने दस्तावेज़ मिल रहे हैं?

2. आईडी द्वारा किसी भी आइटम को लाने के बारे में मुझे कैसे मिलेगा?

उत्तर

3

1 - आप प्राप्त करते समय किया जाना चाहिए 10

अपने संग्रह के लिए एक पेज तर्क जोड़ें और पेज मिलान लौट (10/पेज) बैकएंड कोड है। ?/My_objects पेज = 2 रिकॉर्ड प्राप्त करने के लिए 10-20 आदि

आप इस तरह यह कर (untested):

collection.fetch({data: {page:2}}) 

या आप सीधे URL

2 बदल - एक आइटम लाने के लिए आईडी के आधार पर आप मॉडल

object = new Model({id: 1}) 

बना सकते हैं और लाने यह

object.fetch() 
+0

** 1 ** ठीक है सही तो यह डेटा आपके रीढ़ संग्रह में पृष्ठ पर वर्तमान में है कि करने के लिए केवल आवश्यक है? ** 2 ** ** बैकएंड से मॉडल लाने के लिए मुझे पहले इसे प्रासंगिक आईडी का उपयोग करके बनाना होगा और फिर कॉल को कॉल करना होगा। क्या यह उस संग्रह पर एक "ऐड" ईवेंट ट्रिगर करेगा? या जहां तक ​​बैकबोन का सवाल है कि मॉडल कोई संग्रह नहीं है? – wilsonpage

+0

इसके अलावा आप "पृष्ठ तर्क" क्या बोलते हैं? क्या यह कार्य 'यूआरएल' विशेषता का निर्माण करता है? जैसे। 'url: function() {वापसी x +"/"+ y +"/"+ z;' – wilsonpage

+0

1. दाएं। 2. नहीं, आपको इसे प्रासंगिक संग्रह में जोड़ना होगा। 3. आप यूआरएल विशेषताओं का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि रीढ़ की हड्डी के नवीनतम संस्करणों में आप एजेक्स कॉल को फ़ेच, रीफ्रेश इत्यादि के साथ विकल्प भेज सकते हैं ({डेटा: "यहां आपकी क्वेरी"}) – Julien

5

शायद आप Collection.fetch() का उपयोग नहीं करना चाहते हैं, क्योंकि आपको क्लाइंट-साइड कैशिंग का लाभ नहीं मिलेगा - यह उन आइटम्स को छोड़ देगा जिन्हें आपने पहले ही सर्वर से लोड किया है और संग्रह को रीसेट कर दिया है। आपको अधिक आइटम पुनर्प्राप्त करने के लिए शायद कस्टम फ़ंक्शन के साथ Backbone.Collection को विस्तारित करने की आवश्यकता होगी। मैं हाल ही में एक परियोजना में निम्न कोड का प्रयोग किया:

Backbone.Collection.extend({ 

    // fetch list without overwriting existing objects (copied from fetch()) 
    fetchNew: function(options) { 
     options = options || {}; 
     var collection = this, 
      success = options.success; 
     options.success = function(resp, status, xhr) { 
      _(collection.parse(resp, xhr)).each(function(item) { 
       if (!collection.get(item.id)) { 
        collection.add(item, {silent:true}); 
       } 
      }); 
      if (!options.silent) collection.trigger('reset', collection, options); 
      if (success) success(collection, resp); 
     }; 
     return (this.sync || Backbone.sync).call(this, 'read', this, options); 
    } 

}); 

यह ज्यादातर डिफ़ॉल्ट fetch() कोड से कॉपी किया है, लेकिन इसके बजाय मौजूदा आइटम छोड़ने का यह नए लोगों को जोड़ने जाएगा। ऑब्जेक्ट का उपयोग करके आप options ऑब्जेक्ट का उपयोग करके कुछ सर्वर-साइड को कार्यान्वित करना चाहते हैं, जो आप जो आइटम लोड करना चाहते हैं, उसके पैरामीटर में पास करने का सुझाव देते हैं, शायद या तो पृष्ठ संख्या (यदि आप सर्वर पर पेज आकार को नियंत्रित करना चाहते हैं) या एक स्टार्ट-स्टॉप जोड़ी (यदि आप इसे क्लाइंट पर नियंत्रित करना चाहते हैं)।

+0

धन्यवाद! इसने मेरी बहुत मदद की! –

13

मैं अपने संग्रह पर लाने पर कॉल करते समय {add: true} कथन का उपयोग कर समाप्त हुआ। यह संग्रह को प्राप्त करने के परिणामस्वरूप प्रतिस्थापित करने से रोकता है और इसके बजाय परिणाम को संग्रह में जोड़ता है। मैंने {data: {skip: amountOfItemsInCollectionAlready } का उपयोग करके 'स्किप' राशि भी पारित की, डेटाबेस से आइटम्स के सही बैच प्राप्त करने के लिए सर्वर-साइड पर इसका उपयोग किया जाता है।

मेरे अंतिम लाने विधि इस प्रकार है:।

loadMore: function(e){ 

     this.collection.fetch({ 
      add: true,// this adds to collection instead of replacing 
      data:{// this is optional params to be sent with request 
       skip: this.collection.length// skip the number of items already in the collection 
      } 
     }); 
    } 
+0

मैं सोच रहा था कि यह करने का यह पसंदीदा तरीका था! अन्य विकल्प आवश्यकतानुसार अधिक काम की तरह लग रहे थे। – Crisfole

+20

बैकबोन 0.9.10 उपयोगकर्ताओं के लिए बस एक नोट: fetch() अब 'add: true' विकल्प स्वीकार नहीं करता है। हालांकि आप वही चीज़ प्राप्त कर सकते हैं हालांकि '{update: true, remove: false} 'के साथ – webXL

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