2011-08-21 17 views
36

मेरे पास 2 मॉडल और एक संग्रह है। JobSummary एक मॉडल है, JobSummaryListJobSummary आइटम का एक संग्रह है, और फिर मैं एक JobSummarySnapshot मॉडल एक JobSummaryList जिसमें होती है: जब छोड़करसंग्रह के साथ Backbone.js मॉडल

JobSummary = Backbone.Model.extend({}); 

JobSummaryList = Backbone.Collection.extend({ 
    model: JobSummary 
}); 

JobSummarySnapshot = Backbone.Model.extend({ 
    url: '/JobSummaryList', 

    defaults: { 
     pageNumber: 1, 
     summaryList: new JobSummaryList() 
    } 
}); 

जब मैं JobSummarySnapshot वस्तु पर fetch कहते हैं, यह हो जाता है सब कुछ ... मैं summaryList संग्रह के माध्यम से स्थानांतरित करें वे सभी प्रकार object हैं और JobSummary नहीं हैं।

मुझे लगता है कि defaults ऑब्जेक्ट के अलावा यह समझ में आता है, यह नहीं जानता कि summaryListJobSummaryList प्रकार का होना चाहिए। मैं प्रत्येक आइटम के माध्यम से जा सकता हूं और इसे JobSummary ऑब्जेक्ट में बदल सकता हूं, लेकिन मुझे उम्मीद थी कि इसे मैन्युअल रूप से किए बिना इसे करने का कोई तरीका था।

var returnData = { 
    pageNumber: 3, 
    summaryList: [ 
     { 
     id: 5, 
     name: 'name1'}, 
    { 
     id: 6, 
     name: 'name2'} 
    ] 
}; 

var fakeserver = sinon.fakeServer.create(); 
fakeserver.respondWith('GET', '/JobSummaryList', [200, 
{ 
    'Content-Type': 'application/json'}, 
           JSON.stringify(returnData)]); 

var callback = sinon.spy(); 


var summarySnapshot = new JobSummarySnapshot(); 
summarySnapshot.bind('change', callback); 

summarySnapshot.fetch(); 
fakeserver.respond(); 

var theReturnedList = callback.getCall(0).args[0].attributes.summaryList; 

_.each(theReturnedList, function(item) { 
    console.log('Original Item: '); 
    console.log(item instanceof JobSummary); // IS FALSE 
    var convertedItem = new JobSummary(item); 
    console.log('converted item: '); 
    console.log(convertedItem instanceof JobSummary); // IS TRUE 
}); 

अद्यतन:

यहाँ अपने परीक्षण कोड (jsfiddle here काम) है यह मेरे लिए हुआ है कि मैं पार्स समारोह को ओवरराइड और इसे उस तरह से सेट कर सकते हैं ... मैं अब इस राशि:

JobSummarySnapshot = Backbone.Model.extend({ 
    url: '/JobSummaryList', 

    defaults: { 
     pageNumber: 1, 
     summaryList: new JobSummaryList() 
    }, 

    parse: function(response) { 
     this.set({pageNumber: response.pageNumber}); 

     var summaryList = new JobSummaryList(); 
     summaryList.add(response.summaryList); 

     this.set({summaryList: summaryList}); 
    } 
}); 

यह अब तक काम करता है। मामले में किसी को खुला प्रश्न छोड़कर उस पर टिप्पणी ....

उत्तर

55

आपका parse() समारोह नहीं set() कुछ भी, बस विशेषताओं वापस जाने के लिए अपने एक बेहतर अभ्यास, रीढ़ यह स्थापित करने का ख्याल रखना होगा चाहिए। जैसे

parse: function(response) { 
    response.summaryList = new JobSummaryList(response.summaryList); 
    return response; 
} 

तुम जो भी parse() से लौटने passed to set() है।

कुछ भी (जो undefined लौटने की तरह है) पर वापस लौट नहीं, set(undefined) कॉल करने जैसा ही है जो करता है, तो अपने कस्टम validate()/set() तरीकों एक वस्तु प्राप्त करने की उम्मीद है यह मान्यता, या कुछ अन्य अप्रत्याशित परिणाम पारित करने के लिए नहीं का कारण बन सकता है। यदि आपकी सत्यापन या set() विधि उस वजह से विफल हो जाती है, तो options.successBackbone.Model#fetch() पर कॉलबैक को कॉल नहीं किया जाएगा।

इसके अलावा, इस अधिक सामान्य बनाने के लिए है, तो set() अन्य स्थानों (और न केवल सर्वर प्रतिक्रिया से) भी यह प्रभाव, आप के बजाय set() ओवरराइड करने के लिए चाहते हो सकता है से एक सादे वस्तु को ing कि:

set: function(attributes, options) { 
    if (attributes.summaryList !== undefined && !(attributes.summaryList instanceof JobSummaryList)) { 
     attributes.summaryList = new JobSummaryList(attributes.summaryList); 
    } 
    return Backbone.Model.prototype.set.call(this, attributes, options); 
} 

आपको Backbone-relational दिलचस्प भी मिल सकता है - यह मॉडलों के अंदर घोंसला वाले संग्रह/मॉडल से निपटने में बहुत आसान बनाता है।

संपादित मैं कोड अब अद्यतन किया जाता है

+0

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

+1

'सेट' उदाहरण से प्यार करें! – Bart

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