2013-06-03 7 views
10

के साथ एकाधिक मॉडल युक्त संग्रह में बैकबोन में एक विलय संग्रह है जिसमें फ़ोटो और एल्बम शामिल हैं।Backbone.js: संग्रह में एक ही आईडी

उनके बीच अंतर करने के लिए, मैंने एक क्षेत्र type जोड़ा है जो या तो photo या album है। जब मैं संग्रह को पॉप्युलेट, मैं Collection#model विधि के भीतर विभिन्न मॉडल बनाने

model: (attrs, options) -> 
    switch attrs.type 
     when 'album' then new App.Models.Album(attrs, options) 
     when 'photo' then new App.Models.Photo(attrs, options) 

अब मैं जहां एक तस्वीर और एक ही आईडी के साथ एक एलबम जोड़ने एक अजीब बग discoverd गए किसी मर्ज में परिणाम (मान लीजिए कि 2 हैं)।

मैंने इसे स्रोत कोड में these LOC पर ट्रैक किया है। ऐसा लगता है कि यह बैकबोन का एक कांटा बनाये बिना पूर्ववत है। मैंने कोशिश की है लेकिन यह भी fails 35 tests है।

मैं ऐसा करने का 4 अलग अलग तरीकों के बारे में सोचा, मैं नहीं जानता कि जो उनमें से बेहतर एक है:

  1. मैं आईडी के लिए एक उपसर्ग जोड़ सकते हैं। मान लें photo_2। यह बैकएंड में बदलाव के साथ-साथ फ्रंट में कुछ बदलावों को /photos/photo_2
  2. पर बैकबोन और change these LOC का उपयोग कर सकता है।
  3. मैं दो अलग संग्रह बना लेकिन किसी मर्ज और ध्यान में रखते हुए एक तरह से निपटने के लिए हो सकता था
  4. मैं की एक फोटो पहचान पत्र के साथ शुरू कर सकता है (जो ग्राहकों प्रदर्शन प्रभाव और बैकएंड के एक नए सिरे से लिखना की आवश्यकता है), मान लें कि 1000000 जाने । इससे संभावना कम हो जाएगी कि किसी दिए गए उपयोगकर्ता ने किसी दिए गए आईडी के साथ फोटो अपलोड किया है, उसी आईडी के साथ एक एल्बम भी बनाया है।

उत्तर

7

संस्करण 1.2 के बाद से आप कैसे अपने संग्रह विशिष्ट मॉडल की पहचान करेगा निर्दिष्ट करने के लिए Collection.modelId उपयोग कर सकते हैं। आपके मामले में, आप यह सुनिश्चित करने के लिए निम्नलिखित कर सकते हैं कि आपके प्रकार के अलग-अलग आईडी हैं।

var MyCollection = Backbone.Collection.extend({ 
    modelId: function (attrs) { 
     return attrs.type + "-" + attrs.id; 
    } 
    // ... 
    }) 
+0

क्या मॉडल को इसके गुणों के बजाय यहां तर्क के रूप में प्राप्त करने का कोई तरीका है? –

7

मेरा सुझाव है कि दोनों एल्बम और फोटो पर, आप निम्नलिखित जोड़ें:

idAttribute: 'uniqueId' 
    parse: function(response) { 
    response.uniqueId = type+'_'+response.id 
    return response; 
    } 
संबंधित मुद्दे