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?
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.
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;
}
Un autre exemple si vous utilisez l'alliage de titane:
collection.fetch({
data: {
where : JSON.stringify({
page: 1
})
}
});