152 votes

Backbone.js récupère avec les 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?

213voto

Joe Points 34413

en changeant:

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

à:

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

Donc, sans le faire, cela s'appelle avec votre {data: {page:1}} objet 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);
};
 

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

71voto

Jimchao Points 1005

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 le processData car Backbone utilisera une autre méthode pour traiter les données dans POST, UPDATE ...

dans Backbone source:

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

1voto

Nightwish1986 Points 63

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

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

0voto

Somnath Kokane Points 1

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

objet de données de processus jquery en chaîne, lorsque processData est défini sur true

-2voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X