web-dev-qa-db-fra.com

Backbone.js chercher avec des paramètres

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é ê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 de récupération?

152
Shawn Mclean

en changeant:

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

à:

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

Donc, sans plus, cela est appelé avec votre objet {data: {page:1}} comme 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);
};

Donc, il envoie les 'données' à jQuery.ajax qui fera de son mieux pour ajouter tout ce que params.data sera à l'URL.

213
Joe

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 le code source:

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

Un autre exemple si vous utilisez l'alliage de titane:

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