Backbone.js mengambil parameter


152

Setelah dokumentasi , saya lakukan:

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

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

url berubah menjadi: http://localhost:1273/Items?[object%20Object]

Saya mengharapkan sesuatu seperti http://localhost:1273/Items?page=1

Jadi, bagaimana cara saya lulus params dalam metode pengambilan?


Pasti aneh. Apa yang Anda miliki tampaknya berfungsi dengan baik, berdasarkan dokumen API . Apakah Anda menggunakan versi terbaru dari Backbone.js?
Matt Ball

Bisakah kamu mencoba JSON.stringify({ data: { page: 1} })?
Joe

@ Jo Tuskan, saya tidak yakin apa yang harus dilakukan dengan itu, tapi saya lakukan: collection.fetch(JSON.stringify({ data: { page: 1} }));dan tidak ada yang berlalu di url.
Shawn Mclean

Oke, lakukan ini: collection.fetch ({data: JSON.stringify ({halaman: 1})});
Joe

3
Ini berfungsi dengan baik ketika Anda menulisnya di Backbone 1.0 fyi
Dominic

Jawaban:


213

mengubah:

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

untuk:

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

Jadi tanpa melakukan itu, ini disebut dengan {data: {page:1}}objek Anda sebagaioptions

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);
};

Jadi ia mengirim 'data' ke jQuery.ajax yang akan melakukan yang terbaik untuk menambahkan apa pun params.datake URL.


71

Anda juga dapat mengatur processData menjadi true:

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

Jquery akan secara otomatis memproses objek data menjadi string param,

tetapi dalam fungsi Backbone.sync, Backbone mematikan prosesData karena Backbone akan menggunakan metode lain untuk memproses data dalam POST, UPDATE ...

dalam sumber Backbone:

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


-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);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.