2012-06-03 16 views
11

में संबंधों को कैसे संभाला जाए, मैं अपने मॉडल रिश्तों के संबंध में अपने backbone.js एप्लिकेशन को डिज़ाइन करने के तरीके से अटक गया हूं।backbone.js

यदि मेरे पास एक इवेंट मॉडल है, जिसमें दो रिश्ते हैं, तो कहें कि उपयोगकर्ता मॉडल में कई घटनाएं हो सकती हैं और ईवेंट मॉडल में कई टिप्पणियां और भागीदारी हो सकती है। उपयोगकर्ता के पास कई टिप्पणियां हो सकती हैं और भागीदारी में एक उपयोगकर्ता और एक ईवेंट हो सकता है। वाह, क्या गड़बड़ है!

Event has many Comments 
Event has many Participations 
Event has one User 

User has many Events 
User has many Participations 
User has many Comments 

Comment has one Event 
Comment has one User 

Participation has one User 
Participation has one Event 

शाबाशी, तो मेरे विचार घटनाओं की एक सूची लोड करने के लिए जब उपयोगकर्ता पृष्ठ को लोड करता था, और एक घटना पर एक उपयोगकर्ता क्लिक करता है कि घटना के बारे में जानकारी के बाकी लोड (टिप्पणी, सहभागिता और उपयोगकर्ता) ।

तो प्रश्न यह है कि, क्या मुझे किसी भी प्रकार के वैश्विक चर का उपयोग सभी घटनाओं, उपयोगकर्ताओं और अन्य को पकड़ने के लिए करना चाहिए, और जब मैं सर्वर से जानकारी लेता हूं तो उसे वहां रखता हूं (और सर्वर से कुछ ले जाने से पहले वहां जांचें) , शायद किसी प्रकार के स्थानीय भंडारण में (और मैं रीढ़ की हड्डी-रिलेशनल का उपयोग करके यह कैसे कर सकता हूं?)।

मेरे पास एक और विचार है कि प्रत्येक घटना के अपने स्वतंत्र डेटा होने दें, इसके साथ समस्या यह है कि जब भी मैं किसी ईवेंट पर क्लिक करता हूं तो मैं शायद अनावश्यक डेटा भेजूंगा।

आप किस तरह से सलाह देते हैं?

धन्यवाद!

उत्तर

0

सिद्धांत में आप सभी अलग-अलग संग्रहों को लोड कर सकते हैं और फिर अपने प्रतिपादन करते समय प्रासंगिक मॉडल को पकड़ने के लिए संग्रह पर स्थानीय फ़िल्टरिंग का उपयोग कर सकते हैं।

आपको इस के साथ सुरक्षा मुद्दों पर विचार करना होगा।

मैं कम से कम आपके प्रश्न से बिल्कुल स्पष्ट नहीं था कि आप जो जानकारी लेते हैं, उसके साथ आप क्या करने जा रहे हैं, लेकिन मैं जितना संभव हो उतना उत्तर देने का प्रयास करूंगा।

मेरी धारणा यह है कि आपके पास कुछ अतिरिक्त डेटा के साथ कुछ प्रकार की घटनाएं हैं और आपको इससे संबंधित जानकारी प्रदर्शित करने की आवश्यकता है।

var Events = Backbone.Collection.extend({ 
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events. 
    initialize: function(){ 
     this.fetch(); 
    } 
}); 

var Comments = Backbone.Collection.extend({ 
    url: '/comments', 
    initialize: function(){ 
     _.bindAll(this, 'getEventComments'); 
     this.fetch(); 
    }, 

    getEventComments: function(event_id){ 
     return _.filter(this.models, function(model){ return model.get('event_id') == event_id; }); 
    } 
}); 
//etc 

अंडरस्कोर के फिल्टर समारोह का उपयोग कर आप बहुत जल्दी प्रासंगिक प्राप्त कर सकते हैं: तो फिर तुम भी टिप्पणी जोड़ने जैसे कार्य करने के लिए सक्षम होना, आदि

जैसा कि मैंने कहा, आप निम्न कार्य विचार कर सकते हैं की जरूरत है जब भी आपको उनकी आवश्यकता होती है मॉडल (उदाहरण के लिए जब प्रतिपादन)।

एक तरह से यह वही है जैसा आप इसे अपने सर्वर साइड स्क्रिप्टिंग में करते हैं। कुछ डेटाबेस आपके सभी तालिकाओं को रिकॉर्ड के साथ रखते हैं, क्योंकि आपके संग्रह यहां होंगे, और आपका कोड केवल कुछ इनपुट के आधार पर प्रासंगिक लोगों के लिए डेटाबेस से पूछता है।

आखिरकार, मैं हमेशा बैकबोन के साथ संयोजन में Requ.js को इंगित करता रहूंगा। बेशर्म एक जवाब मैं आज दे दी है की बात कर रहा है, यह बाहर की जाँच, यह आसान कोई बात नहीं क्या जीवन कर देगा: Backbone Design

18
@mu_is_too_short टिप्पणी की, रीढ़-संबंधपरक तरह

कुछ आप में देख में रुचि रखते हैं हो सकता है। Backbone-relational के साथ आपके मॉडल और submodel संग्रह स्वचालित रूप से बनाए जाते हैं और ईवेंट को माता-पिता-बाल संबंधों में प्रबंधित किया जा सकता है।

मैं आपको कुछ नमूना कोड दूंगा ताकि आप इसके लिए स्वाद प्राप्त कर सकें। आपके उदाहरण कोड का हिस्सा ऐसा कुछ दिख सकता है।

उपयोगकर्ता कई घटनाक्रम है:

User = Backbone.RelationalModel.extend({ 
    relations: [ 
     type: Backbone.HasMany, // Type of relationship 
     key: 'events',   // How we reference the sub-models in collection 
     relatedModel: 'Event', // The sub-model type 
     collectionType: 'EventCollection', // The sub-model collection 
     reverseRelation: { 
      key: 'belongsToUser'   // Key we use to refer to the parent 
     } 
    ], 
    // Other Backbone.Model properties and functions 
}); 

जब आप एक रीढ़-संबंधपरक मॉडल बनाने के लिए, यह स्वचालित रूप से 'कुंजी' है कि आप को नामित के नाम पर आप के लिए submodels का एक संग्रह बनाता है। तो आपके पास प्रत्येक उपयोगकर्ता के पास संबंधित घटनाओं का स्वयं का संग्रह होगा, जो कि tidy-ed up है।

मूल रूप से, जब आप उपयोगकर्ता को बनाते या प्राप्त करते हैं, तो आप इसे संबंधित मॉडलों के संदर्भ देते हैं। तो उदाहरण के लिए, आपके उपयोगकर्ता आईडी = 1 को ईवेंट 5, 7, और 11 की आवश्यकता हो सकती है (मैं केवल आईडी का उपयोग कर रहा हूं)। जब तक इन संदर्भों को सरणी रूप में परिभाषित किया जाता है तब तक आप उन्हें रिलेशनल के fetchRelated विधियों का उपयोग करके आलसी लोड कर सकते हैं।

myUser = new User(); 
myUser.set({ 
    name: 'RayMysterio', 
    age: '26', 
    events: [5, 7, 11] // Or this might just come with the User object from your server 
}); 

myUser.fetchRelated('events'); 
// This will go fetch the related events for this user model from the URL you designate. 

myUser.get('events'); 
// The collection of events are treated like an attribute of the User model. 

myUser.get('events').find(function(eventModel){ 
    return // some find condition - or whatever you want to do on that collection 
}); 

आप उप-मॉडल के लिए कुछ श्रोताओं बाध्य करने के लिए चाहते हो सकता है।

myUser.bind('add:events', function(model, collection) { 
    // Whatever code you want to happen when new models are added to the user events coll 
}); 

आदि आदि

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

उदा। आप उपयोगकर्ता मॉडल का एक नया उदाहरण बनाते हैं।

बैकबोन-रिलेशनल स्वचालित रूप से व्यस्त लिंक बनाता है (इवेंट मॉडल में रिवर्स रिलेशन कुंजी 'वर्क्स टुउसर' (या जो भी आप इसे नाम देते हैं) द्वारा परिभाषित एक विशेषता है। यह मॉडल/उप- मॉडल पदानुक्रम।

अपने रिलेशनल आवश्यकताओं के आधार पर यह एक अच्छा फिट की तरह लगता है।

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

नोट: बस जोर देने के लिए, मोसेलमैन ने Requ.js की सिफारिश की और मैं भी इसके साथ दृढ़ता से सहमत हूं। इसने मेरे कोड को और अधिक प्रबंधनीय बना दिया है। आप इसे एएमडी अनुपालन करने के लिए बैकबोन-रिलेशनल कोड को टिंकर (लपेटें) कर सकते हैं और यह आवश्यकता के साथ बेकार ढंग से काम करता है।

अद्यतन: रीढ़ की हड्डी-संबंधपरक अब 1 अप्रैल, 2014 को रिलीज 0.8.8 के रूप में require.js का समर्थन करता है - धन्यवाद केनेथ

+0

एक ईवेंट मॉडल के माध्यम से उपयोगकर्ता के लिए घटनाओं से संबंधित करना संभव है? 'myUser.set ('ईवेंट', [myEvent1, myEvent2, myEvent3]); ऐसा कुछ? या क्या आपको संबंधित मॉडल आईडी के माध्यम से संबंधों का संदर्भ देना है? –

+1

@orangewarp रीढ़ की हड्डी-रिलेशनल अब 1 अप्रैल, 2014 को रिलीज 0.8.8 के रूप में require.js का समर्थन करता है। Http://backbonerelational.org/#change-log देखें – Kenneth