10

का उपयोग करके एक समग्र पैटर्न को कार्यान्वित करना मेरे वेबैप में एक समग्र संरचना है यानी प्रत्येक श्रेणी संग्रह में अलग-अलग आइटम और अन्य श्रेणियों का मिश्रण हो सकता है क्योंकि इसकी पंक्तियां/नोड/बच्चे (यहां सही शब्दावली सुनिश्चित नहीं हैं)। वास्तव में, यह थोड़ा सा सरल है क्योंकि प्रत्येक संग्रह को मॉडल, श्रेणी द्वारा दर्शाया जाता है, इसलिए अनिवार्य रूप से प्रत्येक श्रेणी संग्रह में आइटम मॉडल और श्रेणी मॉडल दोनों ही बच्चे होते हैं।एमवीसी/बैकबोन.जेएस

सामान्य रूप से यह एमवीसी का उपयोग करके इस संरचना को लागू करने का एक सलाह देने योग्य तरीका है? अधिक विशेष रूप से, Backbone.js में एक संग्रह के लिए एक आदर्श मॉडल संपत्ति के बजाय मॉडल फैक्ट्री (जेसन लेना और जेसन की संरचना के आधार पर जेनरेट करने के लिए कौन सा मॉडल उत्पन्न करना) संभव है?

+0

संक्षेप में, मैं कहूंगा, "मैं नहीं देखता क्यों नहीं", लेकिन मैं उत्सुक हूं कि दूसरों क्या कह सकता है। – JayC

उत्तर

1

हाँ, आप कर सकते हैं। मैंने इसे पहले किया है। मुझे लगता है कि इस लिंक आप मदद कर सकता है: http://documentcloud.github.com/backbone/#Collection-model

यहाँ

मुख्य स्क्रिप्ट मैं अपने प्रोजेक्ट के लिए इस्तेमाल में से एक है: https://gist.github.com/b65893e0c2e3c46d3dc1

+0

मैं वास्तव में यह नहीं समझ सकता कि आपने उस जिस्ट में क्या किया है। मैं देख सकता हूं कि संग्रह में जोड़ा जा रहा है, एक प्रकार के मॉडल, TransactionDetail के मॉडल हैं, मैं चाहता हूं कि स्वतंत्रता दो प्रकारों को जोड़ना चाहें। इस प्रश्न को पोस्ट करने के बाद से मैंने बैकबोन को संपादित करने और मुझे जो चाहिए उसे प्राप्त करने के लिए संपादित करना शुरू किया, लेकिन इसमें टीएच संग्रह के लिए अद्वितीय आईडी नियम हैं, इसलिए मुझे लगता है कि मुझे मॉडल प्रकार और आईडी से उत्पन्न आईडी के साथ कुछ ब्रिजिंग मॉडल बनाना होगा। लेकिन मुझे अभी भी यह देखने में दिलचस्पी है कि – wheresrhys

+0

एक बेहतर तरीका है या नहीं। खैर, मुझे उम्मीद है कि आप ऐसा करने का तरीका ढूंढ सकते हैं जैसे आपको इसकी आवश्यकता है। शुभकामनाएं – MauroPorrasP

+0

वह सही है, आप अपने संग्रह वर्ग की मॉडल संपत्ति के रूप में एक फैक्ट्री फ़ंक्शन दे सकते हैं ... http://documentcloud.github.com/backbone/#Collection-model – inf3rno

5

मैं तुम्हें ऐसा ही कुछ लग रहा है JSON में एक श्रेणी/गई वस्तुओं की सूची प्राप्त कर रहे हैं संभालने हूँ इस ...

{ 
    'id': 1, 
    'name': 'My 1st Category', 
    'children': [ 
     { 
      'id': 2, 
      'name': 'My 2nd Category', 
      'children': [] 
     }, 
     { 
      'id': 1, 
      'name': 'An Item', 
      'price': 109.99 
     } 
    ] 
} 

Backbone.js बॉक्स है कि एक संग्रह में एक से अधिक मॉडल का समर्थन करता है से बाहर कुछ भी नहीं है, लेकिन यह भी मॉडल के प्रकार आप एक संग्रह में डाल पर कोई प्रतिबंध नहीं है ।

संग्रह परिभाषा में मॉडल प्रकार निर्दिष्ट करना केवल एक चीज है, यह बैकबोन को यह जानने देता है कि क्या आप मॉडल प्रकार को बनाने के लिए Backbone.Model ऑब्जेक्ट के बजाय संग्रह में कच्चे JSON को पास करते हैं। यदि आप एक संग्रह में Item मॉडल जोड़ते हैं जिसमें पहले से ही कुछ Category मॉडल शामिल हैं, तो बैकबोन को मॉडल सूची में पॉप-अप करने में कोई समस्या नहीं होगी; यह किसी भी प्रकार की जांच नहीं करता है।

तो इस बात को ध्यान में रखते हुए, आप केवल कच्चे JSON को छोड़कर संग्रह ऑफ़र के बारे में सब कुछ उपयोग कर सकते हैं; आपको इसे स्वयं संभालना होगा। तो आपके विकल्प या तो पहले से ही अपने मॉडल का निर्माण करना है, उन्हें Backbone.Model ऑब्जेक्ट्स में बनाना, या ऐसा कुछ बनाना जो आपके लिए पार्सिंग करेगा।

दूसरे विकल्प के लिए, पार्सर, मैं आपके कच्चे JSON युक्त संग्रह में एक विशेष चर पारित करने का सुझाव देता हूं, फिर अपने initialize फ़ंक्शन में इसे संभालने का सुझाव देता हूं। यहाँ एक उदाहरण है:

var CategoryCollection = Backbone.Collection.extend({ 
    initialize: function(m, models) { 
     _.each(models, function(model) { 
      var modelObject = null; 
      if (model.price !== undefined) { 
       modelObject = new Item(model); 
      } else { 
       modelObject = new Category(model); 
      } 

      this.add(modelObject); 
     }, this); 
    } 
}); 

तो यह एक छोटे से hacky है, लेकिन आप मॉडल के प्रकार के आधार का निर्धारण करता है, तो यह (मेरे उदाहरण में price) एक विशेष क्षेत्र है, मॉडल वस्तु बनाने, तो है कि जोड़ने संग्रह।

var myCollection = new CategoryCollection([], myJSON); 

सूचना आपके पास पहले तर्क के रूप में एक खाली सरणी के बाद से है कि आप किस प्रकार सामान्य रूप से संग्रह करने के लिए मॉडल का एक सेट को भेज देते हैं पारित करने के लिए:

फिर आप इसे इस तरह फोन चाहते हैं।

जब संग्रह का उपयोग करने पर बाद में, आप तय कर सकते हैं अगर आप एक सरल instanceof जांच का उपयोग कर एक Item या Category साथ काम कर रहे:

_.each(myCollection.models, function(model) { 
    if (model instanceof Item) { 
     console.log("It's an Item! Price: ", model.get("price")); 
    } else { 
     console.log("It's a Category!"); 
    } 
}); 
+0

कच्चे में धुंधला करने के लिए विकल्प पैरामीटर का उपयोग करने के लिए साफ विचार डेटा। – wheresrhys

+0

हाहा धन्यवाद। मैंने सोचा कि बैकबोन.जेएस स्रोत को हैक करने से कहीं अधिक आसान होगा। मुझे लगता है कि इसे साफ करने के लिए आप हमेशा एक रैपर क्लास बना सकते हैं जिसे आप केवल अपना JSON पास करते हैं जिसके बदले में आपके लिए संग्रह बनाता है और लौटाता है। –

+0

हाँ, मैं कुछ अन्य संग्रह विधियों को भी हाइजैक/लपेटना चाहता हूं, मुख्य रूप से आंतरिक रूप से बैकबोन के रूप में। मॉडल उम्मीद करता है कि आईडी अद्वितीय हो, उदाहरण के लिए मुझे आईडी को अनुकूलित करने की आवश्यकता होगी ताकि यह या तो एक महत्वपूर्ण मूल्य जोड़ी स्वीकार करे {modelType: id} , या एक स्वरूपित स्ट्रिंग में भी कम हो गया है। – wheresrhys

1

यह काफी बस सार्वजनिक तरीकों parse और में बनाया ओवरराइट करके हासिल की है मॉडल के डेटा को पुनर्प्राप्त करने और सहेजते समय toJSON रीढ़ की हड्डी द्वारा आंतरिक रूप से उपयोग किया जाता है।

सबसे पहले जब आप डेटाबेस से मॉडल को पुनः प्राप्त करते हैं तो आपको मॉडल के parse विधि को अपने उदाहरण से दिए गए आइटमों का प्रतिनिधित्व करने वाले मॉडल बनाने के लिए ओवरराइट करना चाहिए। वहाँ तुम सिर्फ एक प्रारूप है कि बैकेंड पहचान लेंगे करने के लिए इसे क्रमानुसार करने प्रत्येक आइटम के मॉडल पर toJSON विधि कॉल चाहते हैं -

तब पर toJSON विधि डेटा वापस क्या सर्वर को समझ सकता हूँ करने के लिए क्रमानुसार करने प्रयोग किया जाता है को बचाने के। यदि आप Backbone.sync के लिए कोड देखते हैं तो आप देखेंगे कि यदि कोई कस्टम डेटा पास नहीं हुआ है तो मॉडल हमेशा toJSON का उपयोग करके क्रमबद्ध हो जाता है।

मुझे बताएं कि आपको अधिक विस्तृत जानकारी की आवश्यकता है, हालांकि मुझे विश्वास है कि आपको इसे यहां से चुनने में सक्षम होना चाहिए!

+0

मुझे लगता है कि एक समाधान का हिस्सा बन सकता है, लेकिन अन्य विधियां भी हैं जिन्हें ट्विकिंग की आवश्यकता हो सकती है जैसे कि बैकबोन.कोलेक्शन._prepareModel (मेरे ऐप के लिए मैं केवल यह सुनिश्चित कर सकता हूं कि मैं संग्रह.एड (जिसे कॉल करता है) में कच्चे जेसन में कभी भी पास नहीं किया जाता। तैयार मॉडेल आंतरिक रूप से), लेकिन यह एक अच्छा समाधान होगा जो jsons – wheresrhys

+0

की एक सरणी के लिए Collection.add का उपयोग करके संभाल सकता है। मेरा मानना ​​है कि गुणों/जेएसओएन को पार करने के लिए मॉडल की 'सेट' विधि को ओवरराइट करना चाल चल सकता है - इसे कहा जाता है जब 'नए मॉडल ({...})' का उपयोग करते समय और 'collection.add ([{...}, ...])' –

+1

ps का उपयोग करते समय पारित गुणों को सेट करने के लिए मॉडल को प्रारंभिक रूप से सेट किया गया है।हमने बैकबोन 0.9 की त्वरित पहुंचने के बावजूद कठिन तरीका सीखा है कि निजी एपीआई विधियों को संशोधित करने से आप पर बैकफायर हो सकता है :) यही कारण है कि मैं '_prepareModel' के साथ गड़बड़ से दूर रहने की कोशिश करता हूं, इसे दूर नहीं जाना चाहिए - लेकिन उदाहरण के लिए '_add' और '_remove' अब रीढ़ की हड्डी –

1

हां, आप रीढ़ की हड्डी के संग्रह में मॉडल निर्माण के लिए फैक्टरी विधि पैटर्न का उपयोग कर सकते हैं। डेटा संरचना @kpeel's answer में सुझाव मान लिया जाये, तो आप

// Factory method 
var CategoryOrItemFactory = function(data, options) { 
    if (data.children) { 
     return new Category(data, options); 
    } else { 
     return new Item(data, options); 
    } 
}; 

// Model definitions 
var Item = Backbone.Model.extend(); 

var Category = Backbone.Model.extend({ 
    initialize: function() { 
     this.children = new Children(this.get("children")); 
    } 
}); 

var Children = Backbone.Collection.extend({ 
    model: CategoryOrItemFactory 
}); 

तब आप अपने जड़ आइटम (श्रेणी) बन जाएगा निर्धारित कर सकते हैं और पूरा डेटा संरचना बनाई गई है:

// create the root item 
var rootItem = new Category(rawData); 

पहुँच एक श्रेणी के बच्चों को अपने children संपत्ति उदाहरण के लिए

rootItem.children.get(2).get("name"); 

यहां खेलने के लिए jsFiddle with the above code है।

+0

की मास्टर शाखा में चले गए हैं लेकिन डेटाबेस और बैकबोन के साथ समन्वय करने के लिए अभी भी कई समस्याएं हैं। अद्वितीय आईडी की चयन की अपेक्षा (उदाहरण के लिए ठीक से काम नहीं करता http: //jsfiddle.net/Z7Dbr/ - यह दूसरा मिलान परिणाम देता है और पहले अनदेखा करता है)। मैंने आपके उदाहरण में नोटिस किया है कि श्रेणी संग्रह के बजाय मॉडल का विस्तार करती है, और मुझे यकीन नहीं है कि मैं इसके साथ कितना सहज हूं, हालांकि backbone.js के व्यापक रिफैक्टर करने से बचने के लिए शायद मुझे किसी प्रकार का संकर बनाना होगा संग्रह – wheresrhys

+0

से विरासत के बजाय संपत्ति के रूप में संग्रह के साथ कक्षा, ठीक है, मैंने आपके प्रश्न का उत्तर देने का प्रयास किया है: चाहे मॉडल फैक्ट्री (हाँ) हो। आपके श्रेणियों में गुण होना चाहिए (उदा। आईडी) ताकि उन्हें मॉडल से व्युत्पन्न किया जाना चाहिए (उदा। एक संग्रह की 'get' मॉडल की विधि से कुछ और करता है)। आईडी के बारे में: आप अपनी डेटा प्रविष्टियों को पहली जगह कैसे पहचानते हैं? मुझे लगता है कि एक सार्थक और अद्वितीय पहचानकर्ता को आसानी से बनाना संभव होना चाहिए? –

+0

और समन्वयन के लिए: आइटम/श्रेणियों और बच्चों दोनों के लिए सही 'url' मान सेट करना संभव होना चाहिए। आप अपना डेटा कैसे सिंक करते हैं? क्या आप हमें कुछ वास्तविक डेटा दिखा सकते हैं? –

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

  • कोई संबंधित समस्या नहीं^_^