2012-02-29 8 views
5

मेरे पास Member नामक एक रीढ़ की हड्डी मॉडल है - इसमें सदस्यता नाम जैसे अंतिम नाम, अंतिम नाम, ईमेल, फोन इत्यादि शामिल हैं। इसमें बहु-मूल्यवान फ़ील्ड भी शामिल हैं जिन्हें मुझे संग्रह के रूप में रखने की आवश्यकता है - ये Degrees और Affiliations हैं।संग्रह को शामिल करने के लिए बैकबोन मॉडल में मैं सही ढंग से पार्स कैसे कार्यान्वित कर सकता हूं?

मेरे मॉडल में fetch() विधि को कॉल करते समय मैं जिस समस्या को चला रहा हूं वह यह है कि मूल सरणी और मेरे मॉडल में संग्रह ऑब्जेक्ट्स के बीच एक प्रकार का प्रतिबाधा है। चूंकि parse परिभाषा के अनुसार set में मूल्य निर्धारित करने के बजाय 0 हैमें उपयोग किया जाना है, इसलिए मेरे संग्रह को इस तरह से सेट करना असंभव है। उदाहरण के लिए - यदि मैं Degrees के लिए एक जावास्क्रिप्ट ऑब्जेक्ट देता हूं जो निम्न जैसा दिखता है: {degrees: [{id: 1, title: "PhD"}]}, तो यह मेरे degree संग्रह को एक फ्लैट सरणी में परिवर्तित करता है। यहाँ मेरी कोड है:

window.Models.Member = Backbone.Model.extend({ 

    url: '/api/member', 

    initialize: function() { 

     _.bindAll(this); 

     this.set('degrees', new window.Collections.DegreesList()); 

     this.fetch(); 

    }, 

    parse: function(response) { 

     var setHash = {}; 

     setHash.first_name = response.first_name; 
     setHash.last_name = response.last_name; 
     setHash.office_phone = response.office_phone; 

     // When this is run, this.get('degrees') will now return a flat array rather than a DegreesList collection 
     setHash.degrees = _(response.degrees).each(function(item) { 
       return {id: item.id, title: item.title} 
     }); 

     return setHash; 

    } 

}); 

मैं मैन्युअल रूप से मेरी पार्स समारोह में संग्रह सेट कर सकते हैं, लेकिन वह अपनी रीढ़ रास्ते को नष्ट, और hacky की तरह लगता है।

संपादित करें: मैं अस्थायी रूप से निम्न कार्य करके समस्या को हल किया है:

parse: function(response) { 

    var setHash = {}; 

    setHash.first_name = response.first_name; 
    setHash.last_name = response.last_name; 
    setHash.office_phone = response.office_phone; 

    this.get('degrees').reset(response.degrees); 

    return setHash;  
} 

मुझे शक है इस इष्टतम समाधान है, लेकिन यह निश्चित रूप अब के लिए काम करता है। मैं बेहतर सुझावों के लिए खुला हूं।

+4

इस प्रयास करें: खाई 'पार्स:' समारोह (ऐसा नहीं प्रतीत नहीं होता है), और इसके बजाय 'प्रारंभ करें: 'मैन्युअल रूप से' सरणी 'विशेषता को सरणी से बैकबोन संग्रह में बदल दें ... –

+0

' पर्स' विधि 'fetch' विधि लौटने के बाद स्वचालित रूप से कॉल हो जाती है। मैं 'fetch' कहने के बाद मैन्युअल रूप से 'डिग्री' विशेषता को संग्रह में रीसेट कर सकता हूं, लेकिन तब मेरे पास उस संग्रह में कोई भी डेटा नहीं होगा जो मैं चाहता हूं ... और डेटा आ रहा है। – rybosome

+0

आपके पास होगा यदि आप मैन्युअल रूप से उन्हें 'पार्स' में जोड़ते हैं तो 'डिग्री' के साथ बहुत सी चीजें करने के लिए। @ ŠimeVidas के सुझाव के साथ जाएं और उनके लिए बैकबोन संग्रह का उपयोग करें। यह आपको प्रत्येक 'डिग्री' बैकबोन तरीके से निपटने देता है। – sntran

उत्तर

2

मैं कुछ बदलावों को छोड़कर आप वही कामकाज का उपयोग कर रहा हूं जो आप प्रस्तावित कर रहे हैं।

  1. गलतफहमी से बचने के लिए मैं JSON में संग्रह फोन: degreesData
  2. initialize में मैं इस तरह संग्रह बनाने: this.degrees = new Degrees().reset(this.get("degreesData"));
+0

पुराने प्रश्नों को खोदने के लिए खेद है, लेकिन आप शुरुआती अंदर से डिग्रीडेटा कैसे प्राप्त कर सकते हैं? जब आप मॉडल को तुरंत चालू करते हैं तो रन प्रारंभ करें .. जब तक आप प्रारंभ नहीं करते हैं, तब तक degressData पॉप्युलेट नहीं किया जाएगा। – raynjamin

+0

@raynjamin जो मैं आरंभ में पॉप्युलेट करता हूं वह 'डिग्री' संग्रह नहीं है 'डिग्रीडेटा' विशेषता। 'डिग्रीडेटा' विशेषता प्रारंभिक JSON के हिस्से के रूप में आती है जिसका उपयोग मॉडल को प्रारंभ करने के लिए किया जाता है, इसलिए यह जानकारी 'प्रारंभिक()' में उपलब्ध है। _ (अगर मुझे ठीक से याद है) _ – fguillen

+0

इसे फिर से खोदना, अगर आपको खाली मॉडल को प्रारंभ करने की आवश्यकता है तो क्या होगा? आपको डिफ़ॉल्ट और सामान में कोडिंग शुरू करना होगा। शायद पार्स एक बेहतर विकल्प है, कम से कम आप (लगभग) उस बिंदु पर डेटा रखने की गारंटी देते हैं। – backdesk

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