2011-12-21 13 views
35

क्या बैकबोन संग्रह आसानी से क्लोन करने का कोई तरीका है? मुझे आश्चर्य है कि मॉडल के लिए विधि में कोई निर्माण क्यों नहीं है। मेरी समस्या यह है कि मेरे पास एक मॉडल है जिसमें बच्चों का संग्रह होता है। जब मैं मॉडल क्लोन करता हूं। मेरे पास अभी भी बच्चों का संग्रह है लेकिन केवल उनके डिफ़ॉल्ट मानों के साथ।रीढ़ की हड्डी संग्रह को क्लोन कैसे करें

उत्तर

13

आपका उपयोग केस क्या है जिसे आप संग्रह क्लोन करना चाहते हैं?

संग्रह के लिए क्लोन फ़ंक्शन में कोई निर्मित नहीं है क्योंकि आप संग्रह के भीतर मॉडल को क्लोन नहीं करना चाहते हैं। एक मॉडल को क्लोन करने से एक ही मॉडल के दो अलग-अलग उदाहरण हो सकते हैं, और यदि आप एक मॉडल को अपडेट करते हैं, तो दूसरा अपडेट नहीं किया जाएगा।

यदि आप किसी निश्चित मानदंड के आधार पर एक नया संग्रह बनाना चाहते हैं, तो आप संग्रह की फ़िल्टर विधि का उपयोग कर सकते हैं।

var freshmenModels = studentsCollection.filter(function(student) { 
    return student.get('Year') === 'Freshman'; 
} 

var freshmenCollection = new Backbone.Collection(freshmenModels); 

आगे जाना है और संग्रह में मॉडल क्लोन के लिए, आप निम्न कोड

var clonedCollection = new Backbone.Collection(); 
studentsCollection.each(function(studentModel) { 
    clonedCollection.add(new Backbone.Model(studentModel.toJSON())); 
}); 
+1

लेकिन मैं संग्रह में सभी एकल मॉडल की नकल करना चाहते हैं। –

+0

आप ऐसा करने का प्रयास कर रहे हैं कि आपको किसी संग्रह में सभी मॉडलों की प्रतिलिपि बनाने/क्लोन करने की आवश्यकता है? – Paul

+0

मेरे पास उत्पादों का समूह है, जिसमें उप उत्पादों की एक सूची हो सकती है। तो जब कुछ उन्हें टोकरी में डालते हैं तो मुझे सभी उप उत्पादों की प्रतिलिपि बनाना पड़ता है। उपयोगकर्ता उत्पाद की गिनती और उप उत्पादों के लिए बदल सकता है। इसलिए मुझे टोकरी में मूल की एक प्रति चाहिए। –

4

एक अन्य विकल्प लिख सकते हैं आप निम्नलिखित की जरूरत है (जो मैं जब मैंने पाया के लिए क्या देख रहा था इस सवाल;)):

  • संग्रह की प्रतिलिपि मूल संग्रह के रूप में एक ही प्रकार का होना चाहिए (उदाहरण के लिए आप अपने खुद के संग्रह प्रकार है कि Backbone.Collection फैली)
  • 0 बना लिया है
  • संग्रह की प्रति model.clone() विधि का उपयोग कर बनाया जाना चाहिए क्योंकि संग्रह की नकल में मूल
  • मॉडल ही विकल्पों के साथ बनाया जाना चाहिए

कोड:

var models = original.map(function (model) { return model.clone(); });  
var options = _.clone(original.options);  
var copy = new original.constructor(models, options); 

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

59

सबसे आसान तरीका:

var cloned = new Backbone.Collection(original.toJSON()); 

जहां original संग्रह क्लोन करने के लिए है।

क्लोन समर्थन डब्ल्यू या डब्ल्यू/ओ विरासत समर्थन जोड़ने के लिए हमेशा बैकबोन के Collection का विस्तार कर सकता है।

+2

यह एक अच्छा जवाब है क्योंकि यह एक गहरा क्लोन करेगा, जिसका अर्थ है कि यह मॉडल को भी क्लोन करेगा। यदि आप एक उथले क्लोन पसंद करते हैं जहां एक नया संग्रह उसी मॉडल उदाहरणों को इंगित करेगा तो क्रेग माईल्स के उत्तर का उपयोग नीचे करें। – Dre

+0

मॉडल के तरीके होने पर उपयोगी नहीं है – OlehZiniak

7

Backbone Collection clone() विधि का उपयोग करें:

var clonedCollection = myCollection.clone(); 
+1

यह संग्रह का एक लिंक क्लोन करता है, इसलिए myCollection में परिवर्तन क्लोन में परिवर्तन का पालन करेंगे –

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