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?

Shawn Mclean
la source
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.

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

Un autre exemple si vous utilisez un alliage de titane:

 collection.fetch({ 
     data: {
             where : JSON.stringify({
                page: 1
             })
           } 
      });
peponline
la source
1
Qu'est-ce que l'alliage de titane?
Neil
Alloy est un framework MVC pour le SDK Appcelerator Titanium ( 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
la source