2013-06-20 4 views
11

मेरे पास बैकबोन.जेएस का उपयोग करके एक मूल अनुप्रयोग है जो PUT कॉल (मॉडल अपडेट करना) नहीं बना रहा है। फ्रंट-एंड से, मैं मॉडल को कॉल करता हूं save फ़ंक्शन पुट कॉल नहीं करता है; हालांकि, अगर मैं इसे destroy के साथ प्रतिस्थापित करता हूं, तो यह बैक-एंड पर एक डिलीट कॉल करता है। किसी को भी कोई विचार है कि समस्या क्या हो सकती है? वह कार्य जो PUT अनुरोध को फायर नहीं कर रहा है वह saveTask फ़ंक्शन है।Backbone.js - model.save() एक पुट अनुरोध को फायर नहीं कर रहा है

App.Views.Task = Backbone.View.extend({ 
    template: _.template("<label>ID:</label><input type='text' id='taskId' name='id' value='<%= _id %>' disabled /><br><label>Title:</label><input type='text' id='title' name='title' value='<%= title %>' required/><br><label>Content:</label><input type='text' id='content' name='content' value='<%= content %>'/><br><button class='save'>Save</button>"), 
    events: { 
     "change input":"change", 
     "click .save":"saveTask" 
    }, 
    render: function(eventName){ 
     $(this.el).html(this.template(this.model.toJSON())); 
     //console.log(this.generateTemplate()); 
     return this; 
    }, 
    change: function(event){ 
     var target = event.target; 
     console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value); 
     change[target.name] = target.value; 
     this.model.set(change);*/ 
    }, 
    saveTask: function(){ 
     this.model.set({ 
      title:$("#title").val(), 
      content:$("#content").val() 
     }); 
     if(this.model.isNew()){ 
      App.taskList.create(this.model); 
     } else { 
      this.model.save({}); 
     } 
    } 
}); 
+0

बैकबोन का कौन सा संस्करण आप उपयोग कर रहे हैं? संस्करण 0.9.9 के साथ मॉडल अद्यतन करते समय मुझे कुछ समस्याएं थीं। यह रीढ़ या आपके रीढ़ की हड्डी के संस्करण के साथ एक बग के दौरान एक मूक त्रुटि हो सकती है। – mor

उत्तर

18

यदि आपका मॉडल नया है, तो जब आप इसे सहेजते हैं तो यह एक पोस्ट विधि को आग लगा देगा। यदि आपका मॉडल हालांकि नया नहीं है और आप इसे अपडेट कर रहे हैं, तो यह एक पुट को आग लगा देगा।

यदि यह आपके लिए काम नहीं कर रहा है तो ऐसा हो सकता है क्योंकि यदि आपके पास एक अलग नाम वाले आईडी का उपयोग कर रहे हैं, तो उदाहरण के लिए taskID, तो अपने मॉडल में आपको idAttribute सेट करना होगा taskID के लिए रीढ़ की हड्डी इस संपत्ति का उपयोग आईडी के रूप में करती है और सबकुछ सामान्य होगा।

इस तरह:

var Task= Backbone.Model.extend({ 
    idAttribute: "taskId" 
}); 

यहाँ Idattibute पर प्रलेखन के लिए लिंक http://backbonejs.org/#Model-idAttribute

है भी एक और समस्या हो सकती है {} में अपने को बचाने के फोन कोशिश सिर्फ

this.model.save(); 

के बजाय 210
this.model.save({}); 
+0

प्रतिक्रिया के लिए धन्यवाद। मेरे मॉडल में एक आईडी प्रॉपर्टी है, और मैंने 'idAttribute' सेट किया है - यह सुनिश्चित करने के लिए, मैंने मॉडल की आईडी ('this.model.id') की जांच की है क्योंकि मैं सहेजने का प्रयास करता हूं। यह अभी भी एक पुट आग नहीं है - और 'model.destroy()' ठीक काम करता है।क्या मुझे कुछ और याद आ रही है? –

+0

आपके पास {} सहेजने के कॉल के अंदर क्यों है? मुझे लगता है कि यह सिर्फ model.save() होना चाहिए; पैरामीटर के रूप में कोई खाली वस्तु शाब्दिक के साथ। –

+0

धन्यवाद - यह एक टाइपो है (पहले सफलता कॉलबैक का उपयोग करने की कोशिश की गई), लेकिन ऐसा प्रतीत नहीं होता है (कोई अंतर नहीं)। मॉडल सही ढंग से बदल रहा है (गुण अपडेट किए गए हैं), लेकिन सर्वर को सहेज नहीं रहे हैं। –

2

मेरा मानना ​​है कि मॉडल हमेशा विकल्प पैरामीटर शायद उम्मीद है और यह भी है कॉलबैक

this.model.save(null, { 
    success: function (model, response) { 

     // 
    }, 
    error: function() { 
     // 
    } 
}); 

आप रीढ़ src को देखें, तो आप वह भी देखेंगे ...

======

// Set a hash of model attributes, and sync the model to the server. 
// If the server returns an attributes hash that differs, the model's 
// state will be `set` again. 
save: function (key, val, options) { 
    var attrs, method, xhr, attributes = this.attributes; 

    // Handle both `"key", value` and `{key: value}` -style arguments. 
    if (key == null || typeof key === 'object') { 
     attrs = key; 
     options = val; 
    } else { 
     (attrs = {})[key] = val; 
    } 

    options = _.extend({ 
     validate: true 
    }, options); 

    // If we're not waiting and attributes exist, save acts as 
    // `set(attr).save(null, opts)` with validation. Otherwise, check if 
    // the model will be valid when the attributes, if any, are set. 
    if (attrs && !options.wait) { 
     if (!this.set(attrs, options)) return false; 
    } else { 
     if (!this._validate(attrs, options)) return false; 
    } 

    // Set temporary attributes if `{wait: true}`. 
    if (attrs && options.wait) { 
     this.attributes = _.extend({}, attributes, attrs); 
    } 

    // After a successful server-side save, the client is (optionally) 
    // updated with the server-side state. 
    if (options.parse === void 0) options.parse = true; 
    var model = this; 
    var success = options.success; 
    options.success = function (resp) { 
     // Ensure attributes are restored during synchronous saves. 
     model.attributes = attributes; 
     var serverAttrs = model.parse(resp, options); 
     if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
     if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
      return false; 
     } 
     if (success) success(model, resp, options); 
     model.trigger('sync', model, resp, options); 
    }; 
    wrapError(this, options); 

    method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 
    if (method === 'patch') options.attrs = attrs; 
    xhr = this.sync(method, this, options); 

    // Restore attributes. 
    if (attrs && options.wait) this.attributes = attributes; 

    return xhr; 
}, 
2

मेरे मामले में यह विफल रहता है कारण validations.As को मैं मॉडल की आवश्यकता नहीं है कि यह मॉडल और संग्रह जो मैं इंटरफ़ेस लिस्टिंग के लिए उपयोग कर रहा हूँ की सभी विशेषताओं की पुष्टि करता है सब एक को बचाने के मॉडल के ttributes।

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

मैंने जिस मामले का सामना कर रहा हूं उसके लिए समाधान लिखना है, अन्य को विभिन्न मुद्दों का सामना करना पड़ सकता है।

0

बैकबोन का sync function वह है जिसे मैं उपयोग कर घायल करता हूं। आपको पहले पैरामीटर ('विधि' पैरामीटर) के रूप में 'अपडेट' में पास करना होगा।

+0

यह जानना अच्छा होगा कि नीचे वोट क्या है। मेरे और इस साइट के लिए भी बहुत रचनात्मक :) – Stubbs

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