2013-01-18 24 views
5

के लिए यूआरएल पैराम पर जेएसओएन एन्कोडिंग मुझे बैकबोन.मोडेल.save कॉल बनाने में कुछ परेशानी हो रही है। जिस वेब सेवा को मैं कॉल कर रहा हूं वह यूआरएल पैरामीटर का उपभोग करता है, लेकिन जावास्क्रिप्ट में जो कुछ है वह बदले गए फ़ील्ड का एक ऑब्जेक्ट है। उदाहरण के लिए, मेरे पास ऑब्जेक्ट {foo: 'bar', yar: 'har'} है, और मुझे बैकबोन.मोडेल.save http://server/path/to/service?foo=bar&yar=harबैकबोन.Model.save (पैच = सत्य)

जैसे यूआरएल को पैच अनुरोध भेजने के लिए सरल, सही लगता है? यह मुझे किसी भी तरह की परेशानी का एक गुच्छा दे रहा है। यहाँ मैं अब तक क्या आपके पास यह है (जो काम नहीं करता, मैं सफलता/त्रुटि कॉलबैक, भी है, लेकिन मुझे नहीं लगता कि उन सवाल के लिए महत्वपूर्ण हैं):

object = 
    foo: 'bar', 
    yar: 'har' 

model.save object, 
    patch: true 

मैं कुछ कोशिश की है अन्य विकल्प भी:

model.save object, 
    patch: true 
    emulateJSON: true 

इस सेट contentType को "application/x-www फार्म-urlencoded" है, जो अच्छा है, लेकिन Backbone.sync द्वारा ajax अनुरोध में भेजा गया डेटा था: {मॉडल: " {"foo": "bar", "yar": "har"} "। सेवा को यह पता चला कि उसे "मॉडल" संपत्ति के साथ क्या करना है।

model.save object, 
    patch: true 
    contentType: "application/x-www-form-urlencoded" 

यह सिर्फ कोड object स्ट्रिंग के रूप और सामान options.data में कि। फिर, सेवा नहीं जानता कि इसके साथ क्या करना है।

कोई अन्य विचार है कि मैं इसे अपनी सेवा के विशिष्टता के अनुरूप कैसे प्राप्त कर सकता हूं? मैं खुद को AJAX कॉल कर सकता हूं और मॉडल (और संग्रह से संबंधित) को अपडेट कर सकता हूं, लेकिन मैं वास्तव में ऐसा नहीं करता। एक अजाक्स अनुरोध है कि मेरे लिए काम करता है:

$.ajax 
    url: "http://server/path/to/service" 
    type: "PATCH" 
    data: object 

अद्यतन: कारण मेरे दो पहले विकल्प काम नहीं किया Backbone.js अपने आप में स्पष्ट है:

// Ensure that we have the appropriate request data. 
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 
    params.contentType = 'application/json'; 
    params.data = JSON.stringify(options.attrs || model.toJSON(options)); 
} 

// For older servers, emulate JSON by encoding the request into an HTML-form. 
if (options.emulateJSON) { 
    params.contentType = 'application/x-www-form-urlencoded'; 
    params.data = params.data ? {model: params.data} : {}; 
} 

इस को देखते हुए, मैं शायद सोचा कि अगर मैं options.data में वस्तु में वस्तु भरवां और खाली विशेषताओं में भेजा है, शायद यह काम चाहते हैं:

model.save {}, 
    patch: true 
    data: object 

जाहिर है इस की कोशिश की पैच एक विकल्प "[ऑब्जेक्ट ऑब्जेक्ट]"। मुझे लगता है कि यह ऑब्जेक्ट की एक स्ट्रिंगिफाइज किया गया था ... कहीं ... लेकिन यह सही उत्तर के करीब हो सकता है?

उत्तर

2

ऐसा लगता है कि मैं क्या देख रहा था processData विकल्प jQuery.ajax पर विकल्प है। इस प्रकार यह मेरे लिए URL पैरामीटर में वस्तु प्रसंस्करण नहीं किया गया था

// Don't process data on a non-GET request. 
if (params.type !== 'GET' && !options.emulateJSON) { 
    params.processData = false; 
} 

,: Backbone.sync डिफ़ॉल्ट रूप से निम्नलिखित है। (jQuery API)

तो, कोड का कार्यकारी सा होगा:

model.save {}, 
    patch: true 
    data: object 
    processData: true 

सच में, मैं Backbone.Model का उपयोग कर नहीं किया जा सकता सही ढंग से समग्र ... लेकिन, कम से कम यह काम कर रहा। : पी

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

  • कोई संबंधित समस्या नहीं^_^