2011-08-25 12 views
11

बैकबोन.जेएस का उपयोग करके, मैं सफलतापूर्वक नए मॉडल बनाने और सर्वर पर सहेजने में सक्षम हूं। वे सफलतापूर्वक AJAX कॉल करते हैं और सब्सक्राइब किए गए UI तत्व उचित रूप से अपडेट करते हैं। जिस समस्या में मैं दौड़ता हूं वह यह है कि मुझे नव निर्मित वस्तु की आईडी नहीं पता है।नया बनाते समय मॉडल आईडी कैसे पुनर्प्राप्त करें?

मैं अपने निर्माण कॉल के लिए प्रतिक्रिया शीर्षलेख में देख सकता हूं, कि सेवर एक स्थान शीर्षलेख लौटा रहा है जैसे: Location https://localhost/rest/beta/mobile/footer/OTo3Njow अंतिम पैरामीटर के रूप में अंतिम पैरामीटर के साथ।

backbone.sync को ओवरराइड किए बिना मैं यह आईडी कैसे प्राप्त कर सकता हूं? अगर मुझे backbone.sync को ओवरराइड करना है, तो सबसे साफ तरीका क्या है?

अद्यतन ऐसा लगता है कि मेरे संगठन की तरह एक पुराने Backbone.js जिसमें मॉडलों की पार्स विधि एक्सएचआर वस्तु के लिए एक संदर्भ प्रदान नहीं करता है उपयोग कर रहा है, नहीं तो मैं आईडी को पकड़ने और वहाँ बताए कर सकता है।

उत्तर

10

सर्वर एक वापस भेजना चाहिए जेएसओएन ऑब्जेक्ट में मॉडल के id, साथ ही कोई अन्य विशेषताएँ जो इसे अपडेट करना चाहते हैं। यदि ऐसा होता है, तो बैकबोन स्वचालित रूप से आईडी को पकड़ लेगा।

यदि यह कोई विकल्प नहीं है, तो आपको Backbone.sync ओवरराइड करना चाहिए, क्योंकि तब आपका एपीआई (जो प्रतिक्रिया शरीर के बजाय स्थान शीर्षलेख में नई आईडी को संचारित करता है) यह दर्शाता है कि बैकबोन बॉक्स से क्या समर्थन करता है।


सर्वर पहले से ही इस करता है, और तुम सिर्फ आईडी पर प्राप्त करना चाहते हैं, यह जो जानते हैं की जरूरत पर निर्भर करता है। यदि यह कोड model.save() बुला है, तो यह एक सफलता कॉलबैक में पारित कर सकते हैं:

model.save({}, { 
    success: function(){ 
     // do something with model.id 
    } 
}); 

मॉडल ही अधिसूचित करने की आवश्यकता है जब यह एक आईडी हो जाता है, तो आप एक प्रारंभकर्ता उपयोग कर सकते हैं:

var MyModel = Backbone.Model.extend({ 
    initialize: function(){ 
     this.bind("change:id", function(){ 
      // … 
     }); 
    } 
}); 
1

मैं backbone.sync

// Return XHR on success 
params.success = function(response, text, XHR) { 
    if(_.isFunction(model.xhrParse)) { model.xhrParse.call(model, response, XHR); } 
    success.call(model, response); 
} 

में सफलता परम अधिक भार से और मेरे बेस मॉडल "xhrParse" करने के लिए एक नई विधि जोड़कर इस हल:

xhrParse: function(resp, XHR) { 
    var locationHeader = XHR.getResponseHeader('Location'); 
    if(locationHeader && !this.id) { 
    var xplode = locationHeader.split("/"); 
    this.id = xplode[xplode.length - 1]; 
    } 
    return resp; 
} 
+2

पर सेट नहीं हो रहा है 'this.set (' id ', ...)' का उपयोग करें। जब कोई मॉडल आईडी बदलता है, तो अन्य चीजों को होने की आवश्यकता होती है - आईडी मॉडल के गुण वस्तु में अद्यतन होती है, यदि मॉडल संग्रह में है तो संग्रह को सूचित किया जाना चाहिए कि इसमें एक आईडी है, आदि – s4y

+0

बहुत अच्छी पकड़। धन्यवाद। –

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