2012-05-08 11 views
9

मैं backbone.js को आजमा रहा हूं और जब मैं एक नया मॉडल ऑब्जेक्ट बनाता हूं तो model.save() को कॉल करता हूं। मैं डेटाबेस से आईडी के साथ मॉडल ऑब्जेक्ट को अद्यतन करने के लिए backbone.js डिफ़ॉल्ट व्यवहार की अपेक्षा कर रहा हूं लेकिन यह नहीं है। क्या ऐसा नहीं होना चाहिए? मैंने सत्यापित किया है कि मुझे जेसन प्रारूप में विशेषताओं के साथ एक पोस्ट मिल रही है। मेरा सर्वर जेसन को एक टेबल पर सहेजता है और फिर जेसन को एक नए आईडी फ़ील्ड के साथ backbone.js पर लौटाता है। क्या ये सही है? क्या मेरा सर्वर पूरी नई वस्तु या सिर्फ आईडी या क्या लौटाएगा?backbone.js सहेजने के बाद मॉडल ऑब्जेक्ट की आईडी अपडेट नहीं कर रहा है, क्यों नहीं?

//contents of the POST from backbone.js 
    { "text":"this is a test" } 

//reply from my server 
    { id:"15", text:"this is a test" } 

मेरे नमूना कोड अपने पद से बताने के लिए नीचे दिए गए

var SQLRow = Backbone.Model.extend({ 
table:"", 
urlRoot:'db', 
url:function() { 
    return "/" + this.urlRoot + "?table=" + this.table + 
       "&id=" + this.attributes.id; 
    } 
}); 

var Xtra = SQLRow.extend ({ 
    table:'Xtra' 
}); 

var row = new Xtra({ 
    text: "this is a test" 
}); 

alert(row.url()); 
row.save() 
alert("row:" + row.get("id")); 
+0

प्रतिक्रिया कॉल से वापस लौटने की तरह प्रतिक्रिया क्या होती है? – kinakuta

उत्तर

6

कठिन है। दो विचार:

1) सर्वर से प्रतिक्रिया सफल नहीं है आपकी बचत कॉल वापस क्या करती है?

2) आपकी "आईडी" विशेषता आईडी के अलावा कुछ और नामित है। अलग नाम के लिए खाते में जोड़े गए अपने मॉडल के लिए निम्न:

idAttribute : "MyModelsID", 

संपादित

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

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

वैकल्पिक

@mu_is_too_short उल्लेख किया है, एक और तरीका है और यहां तक ​​कि मॉडल पर बदलाव के लिए सुनने घटना पर प्रतिक्रिया के लिए है। (मैं बस जितना संभव हो सके अपने कोड के करीब जवाब रखने की कोशिश कर रहा था)। लेकिन निम्नलिखित छद्म कोड की तरह कुछ आप आरंभ या, मिलना चाहिए ...

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

यदि आप एक संग्रह/एक listenr दृश्य-कम इस तरह दुनिया में कुछ बनाता है में हैं ...

row.on('change', function() { /* do stuff */ }, this);    
+1

या मॉडल में 'हैंडलर' 'हैंडलर बांधें और उस तरह से' सेव 'का नतीजा उठाएं। बैकबोन एक घटना संचालित ढांचा है, इसे एक धारावाहिक मॉडल में मैश करने की कोशिश कर रहा है, यह अच्छी तरह से काम नहीं करता है (यह हिस्सा ज्यादातर Cjolly के लिए है)। –

+0

@muistooshort - तो हम फिर से मिलते हैं। वैकल्पिक के लिए धन्यवाद, मैंने जवाब में कुछ छद्म कोड शामिल किया। – EBarr

+3

कोड के साथ दो समस्याएं थीं। सबसे पहले सर्वर द्वारा लौटाए गए जेसन प्रारूप को उद्धृत विशेषताओं की कुंजी की आवश्यकता होती है (यानी {id: "ax"} वास्तव में {"id": "ax"} होना चाहिए। मैंने यह परिवर्तन करने के बाद मैं व्यवसाय में था; हालांकि , सहेजने के तुरंत बाद मेरी चेतावनी ऑब्जेक्ट की वास्तविक प्रकृति को कभी भी नहीं दिखाएगी क्योंकि बचत एक एसिंक्रोनस अजाक्स कॉल है और हम हमेशा AJAX और backbone.js को संभालने से पहले अलर्ट प्राप्त करेंगे। एक बदलाव हैंडलर को ** के रूप में जोड़ना एमयू कम है ** ऊपर बताए जाने का सुझाव सही तरीका है: – Cjolly

1

यह उत्तर उपरोक्त उत्तर में Cjolly की एक टिप्पणी पर आधारित है।

यह है कि सर्वर मॉडल के id JSON स्ट्रिंग में इस { "id" : <the id> } की तरह रिटर्न सर्वर से नई जनरेट मॉडल की आईडी के साथ मॉडल assiging में Backbone.Model.save([attributes],[options]) सफल बनाने के लिए आवश्यक है। (ध्यान दें कि यह "id" है और id नहीं है)।

सार रीढ़ की हड्डी में ठीक ही उम्मीद JSON स्ट्रिंग और कैसे वस्तुओं उद्धृत कुंजी के बिना जावास्क्रिप्ट में परिभाषित किया जा सकता के विपरीत, JSON ऑब्जेक्ट कुंजी उद्धृत किए जाने की आवश्यकता (JSON Spec - does the key have to be surrounded with quotes? देखें)

Cjolly की टिप्पणी के अनुसार जब से यह आवश्यक समस्या रही है, मैं इस समाधान को दूसरे जवाब में हाइटलाइट करना चाहता हूं। आंशिक रूप से क्योंकि मुझे एक ही समस्या से मारा गया था और केवल टिप्पणियों को पढ़ने के द्वारा मैं अंतर्दृष्टि प्राप्त करने में सक्षम था।

0

मुझे एक ही समस्या का सामना करना पड़ा है और मुझे जो मिला है वह है कि सहेजे गए मॉडल का मेरा validate फ़ंक्शन वास्तव में बैक एंड से लौटाए गए मॉडल को अमान्य करता है। यही कारण है कि मेरे खेतों को ठीक से अद्यतन नहीं किया गया था।

0

शायद यह थोड़ा सा बहिष्कृत है, लेकिन आज मेरे पास एक ही गायब आईडी थी। यह पता चला है कि सर्वर सिर्फ नए आईडी वाले रीडायरेक्ट के साथ एक शीर्षलेख 'स्थान' भेजता है, लेकिन निरंतर ऑब्जेक्ट को वापस नहीं करता है। प्रतिक्रिया में ऑब्जेक्ट जोड़ना समाधान था। ऐसा लगता है कि ऑब्जेक्ट को वापस नहीं करना रू (स्प्रिंग) जेसन-कंट्रोलर जेनरेट के साथ मानक व्यवहार है।

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