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?

Shawn Mclean
sumber
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.

Joe
sumber
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;
}
Jimchao
sumber
1

Contoh lain jika Anda menggunakan Titanium Alloy:

 collection.fetch({ 
     data: {
             where : JSON.stringify({
                page: 1
             })
           } 
      });
peponline
sumber
1
Apa itu Titanium Alloy?
Neil
Alloy adalah kerangka kerja MVC untuk Appcelerator Titanium SDK ( github.com/appcelerator/alloy )
peponline
-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);
}
Walter von Entferndt
sumber