Backbone.js मापदंडों के साथ लाने के लिए


152

प्रलेखन के बाद , मैंने किया:

var collection = new Backbone.Collection.extend({
        model: ItemModel,
        url: '/Items'
})

collection.fetch({ data: { page: 1} });

url निकला: http://localhost:1273/Items?[object%20Object]

मैं कुछ इस तरह की उम्मीद कर रहा था http://localhost:1273/Items?page=1

तो मैं कैसे लाने के लिए पारस विधि?


यह निश्चित रूप से अजीब है। आपके पास जो दिखता है वह एपीआई डॉक्स के आधार पर ठीक काम करना चाहिए । क्या आप Backbone.js के नवीनतम संस्करण का उपयोग कर रहे हैं?
मैट बॉल

क्या आप कोशिश कर सकते हैं JSON.stringify({ data: { page: 1} })?
जो

@ जोए तुस्कान, मुझे यकीन नहीं है कि उसके साथ क्या करना है, लेकिन मैंने किया था: collection.fetch(JSON.stringify({ data: { page: 1} }));और कुछ भी यूआरएल में पारित नहीं हुआ था।
शॉन मैक्लेन

ठीक है, यह करें: collection.fetch ({data: JSON.stringify ({पेज: 1})}};
जो

3
यह ठीक काम करता है जैसा कि आपने इसे बैकबोन 1.0 फी
डोमिनिक

जवाबों:


213

बदल रहा है:

collection.fetch({ data: { page: 1} });

सेवा:

collection.fetch({ data: $.param({ page: 1}) });

तो ऐसा करने के साथ, यह आपकी {data: {page:1}}वस्तु के रूप में कहा जाता हैoptions

Backbone.sync = function(method, model, options) {
    var type = methodMap[method];

    // Default JSON-request options.
    var params = _.extend({
      type:         type,
      dataType:     'json',
      processData:  false
    }, options);

    // Ensure that we have a URL.
    if (!params.url) {
      params.url = getUrl(model) || urlError();
    }

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

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

    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
    // And an `X-HTTP-Method-Override` header.
    if (Backbone.emulateHTTP) {
      if (type === 'PUT' || type === 'DELETE') {
        if (Backbone.emulateJSON) params.data._method = type;
        params.type = 'POST';
        params.beforeSend = function(xhr) {
          xhr.setRequestHeader('X-HTTP-Method-Override', type);
        };
      }
    }

    // Make the request.
    return $.ajax(params);
};

तो यह 'डेटा' को jQuery.ajax पर भेजता है जो params.dataURL में जो कुछ भी है उसे जोड़ने की पूरी कोशिश करेगा ।


71

आप प्रक्रिया को सही पर सेट भी कर सकते हैं:

collection.fetch({ 
    data: { page: 1 },
    processData: true
});

जेकरी ऑटो डाटा ऑब्जेक्ट को परम स्ट्रिंग में प्रोसेस करेगा,

लेकिन Backbone.sync फ़ंक्शन में, Backbone processData को बंद कर देता है क्योंकि Backbone POST, UPDATE में डेटा को संसाधित करने के लिए अन्य विधि का उपयोग करेगा ...

बैकबोन स्रोत में:

if (params.type !== 'GET' && !Backbone.emulateJSON) {
    params.processData = false;
}

1

एक अन्य उदाहरण यदि आप टाइटेनियम मिश्र धातु का उपयोग कर रहे हैं:

 collection.fetch({ 
     data: {
             where : JSON.stringify({
                page: 1
             })
           } 
      });

1
टाइटेनियम मिश्र धातु क्या है?
नील

मिश्र धातु एप्सीलेटर टाइटेनियम एसडीके ( github.com/appcelerator/alloy ) के लिए एक एमवीसी ढांचा है
13

-2
try {
    // THIS for POST+JSON
    options.contentType = 'application/json';
    options.type = 'POST';
    options.data = JSON.stringify(options.data);

    // OR THIS for GET+URL-encoded
    //options.data = $.param(_.clone(options.data));

    console.log('.fetch options = ', options);
    collection.fetch(options);
} catch (excp) {
    alert(excp);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.