2012-09-12 24 views
27

मान लीजिए कि 2 संग्रह हैं, क्रमशः /api/page/1 और /api/page/2 का प्रतिनिधित्व करते हैं; वैसे भी (अंडरस्कोर के माध्यम से, उदाहरण के लिए) इन 2 संग्रहों को एक नए, एकल संग्रह में विलय करने के लिए है?रीढ़ की हड्डी - एक साथ 2 संग्रह मर्ज करें?

उत्तर

48

विकल्प 1

आप अभी तक संग्रह नहीं दिलवाया है, तो आप पहले एक प्राप्त कर सके, तो {जोड़ें: सच} के साथ एक दूसरे को लाने झंडा और दूसरा एक होगा पहले एक में मर्ज करने:

collection.fetch({data : {page : 2}); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}]; 
collection.fetch({data : {page : 2}, add : true }); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, {id: 3, article : "..."}]; 

विकल्प 2

you'v हैं ई पहले से ही संग्रह दिलवाया और उन्हें दो चर में संग्रहीत किए गए, तो आप सिर्फ दूसरा संग्रह की सभी सामग्री पहले एक में जोड़ सकते हैं:

collection1.add(collection2.toJSON()); 

यह विकल्प ग्रस्त है इस तथ्य से है कि पहले संग्रह आग "जोड़ देगा "घटना जब दूसरा संग्रह इसमें जोड़ा जाता है। इस तरह के अवांछित यूआई कि के रूप में साइड इफेक्ट है, तो इस घटना की वजह से फिर से प्रस्तुत हुई है, आप {चुप: सच} जोड़कर उसे दबाने कर सकते हैं झंडा

collection1.add(collection2.toJSON(), {silent : true}); 

विकल्प 3

तुम सिर्फ जरूरत है इन संग्रहों का JSON प्रारूप, यानीHTML टेम्पलेट प्रतिपादन प्रयोजनों के लिए, तो आप सिर्फ जे एस शाब्दिक के लिए सब कुछ (सरणियों, वस्तुओं) को कम कर सकते हैं:

collection1.toJSON().concat(collection2.toJSON()); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, ...]; 

विकल्प 4 = विकल्प 2 + 3

आप पहले से ही दोनों संग्रहों दिलवाया है, तो आप जे एस शाब्दिक को कम करने और एक नए सिरे से रीढ़ संग्रह

var rawCollection = collection1.toJSON().concat(collection2.toJSON()); 
var newCollection = new Backbone.Collection(rawCollection); 
+1

पूरी तरह से स्पष्टीकरण के लिए धन्यवाद =) – Kay

+12

-1। यदि आप जेसन() को कॉल करते हैं तो आप मॉडल के संदर्भ को खो देते हैं। यदि आप कोई मॉडल बनाते हैं, इसे संग्रह में डालें, संग्रह को किसी अन्य के साथ मर्ज करें, मॉडल बदलें, अंतिम संग्रह में मॉडल अपडेट नहीं किया गया है। यह डीबग करने के लिए एक दुःस्वप्न बन जाएगा। यह ठीक होगा अगर आप मॉडलों की प्रतिलिपि बनाना और उन्हें अलग रखना चाहते थे, लेकिन यह मानक नहीं है और इसे इंगित किया जाना चाहिए। –

+9

यदि आपके पास पहले से ही दो संग्रह हैं, तो आपको शायद नीचे दिए गए किसी भी उत्तर का उपयोग करना चाहिए: 'collection1.add (collection2.models);' –

0

ऐसा लगता है कि ऐसा करके, आप /api/page/{1, 2}/ से जुड़ी अर्थपूर्ण खो देते हैं।

यह भी मुझे लगता है कि न तो रीढ़ की हड्डी, न तो अंडरस्कोर, आपको एक कार्य/विधि प्रदान करता है जो आप करने की कोशिश कर रहे हैं।

तो अपने विकल्प:

  • , एक नया संग्रह बनाने के लिए अपने पिछले संग्रहों से प्रत्येक आइटम जोड़ने;
  • दूसरा एक

में जोड़ने के लिए पहला संग्रह आइटम लेकिन आप शायद पहले से ही इस में पता था।

+0

हां। मुझे लगता है कि यहां समाधान 1 संग्रह होना है और आप '(डेटा: {पृष्ठ: 1}, जोड़ें: सत्य}) ''। प्रत्येक 'fetch() 'के साथ पृष्ठ मान बढ़ाएं और संग्रह में मॉडल के नवीनतम बैच/पृष्ठ को जोड़ें। – jmk2142

+0

आपका समाधान काफी सुंदर लगता है, हालांकि मुझे लगता है कि उसके पास संग्रह पहले ही संग्रहित है, और शायद डेटा को रीफ्रेट करने से बचना चाहता है। लेकिन अगर यह मामला नोट है, तो आपका रास्ता एक अच्छा तरीका है। – ksol

5
collection.add(models, [options]) 

संग्रह मॉडल की सरणी है

collection.models 

रिटर्न मॉडल

की सरणी

संग्रह करने के लिए एक मॉडल (या मॉडल की एक सरणी) जोड़ें।

A = Backbone.Collection; 
collection1 = new A([ 
    {key, 'value'},     //model1 
    {key : value1}     //model2 in collection1 
]); 

B = Backbone.Collection; 
collection2 = new B([ 
    {key1, 'value'},     //model1 
    {key1 : value1}     //model2 in collection2 
]); 


collection1.add(collection2.models); //now, collection1 has four models.. 
0

Collection.models moels और Collection.add की सरणी लिए सीधी पहुँच प्रदान एक तर्क के रूप मॉडल की एक सरणी ले जाएगा करने के लिए सब कुछ जोड़ सकते हैं।

5

उपयोग

collection.models 

collection.toJSON() 
41

के insted इस कोशिश, संग्रह मॉडल

collection1.add(collection2.models); 

अगर हम का उपयोग की सरणी है

collection1.add(collection2.toJSON()); 

तो संदर्भ chage

+6

+1 की आवश्यकता है, यह एकमात्र वास्तविक उत्तर है, वास्तव में स्वीकार किया जाना चाहिए। दस्तावेज़ीकरण देखें: http://backbonejs.org/#Collection-add। आप यह भी तय कर सकते हैं कि डुप्लिकेट स्वीकार करना है या नहीं: गुजरना: {merge: true} –

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