Backbone.js récupérer avec des paramètres


152

Suite à la documentation , j'ai fait:

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

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

l'URL s'est avérée être: http://localhost:1273/Items?[object%20Object]

Je m'attendais à quelque chose comme http://localhost:1273/Items?page=1

Alors, comment puis-je passer des paramètres dans la méthode fetch?


C'est vraiment bizarre. Ce que vous avez semble fonctionner correctement, d'après les documents de l'API . Utilisez-vous la dernière version de Backbone.js?
Matt Ball

Pouvez-vous essayer JSON.stringify({ data: { page: 1} })?
Joe le

@Joe Tuskan, je ne sais pas quoi faire avec ça, mais je l'ai fait: collection.fetch(JSON.stringify({ data: { page: 1} }));et rien n'a été passé dans l'url.
Shawn Mclean

Ok, faites ceci: collection.fetch ({data: JSON.stringify ({page: 1})});
Joe le

3
Cela fonctionne bien comme vous l'avez écrit dans Backbone 1.0 fyi
Dominic

Réponses:


213

en changeant:

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

à:

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

Donc, sans trop le faire, cela s'appelle avec votre {data: {page:1}}objet commeoptions

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

Il envoie donc les 'données' à jQuery.ajax qui fera de son mieux pour ajouter ce qui params.dataest à l'URL.


71

Vous pouvez également définir processData sur true:

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

Jquery traitera automatiquement l'objet de données en chaîne de paramètres,

mais dans la fonction Backbone.sync, Backbone désactive processData car Backbone utilisera une autre méthode pour traiter les données dans POST, UPDATE ...

dans la source 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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.