Être tout à fait honnête, je suis bloqué en essayant de remplacer la méthode de synchronisation de Backbone () pour un modèle, j'ai la signature de la fonction en place et qu'elle est déclenchée correctement, mais Je ne sais pas quoi mettre en place Le corps de la fonction Pour qu'il effectue un appel par défaut à supprimer mais avec des arguments supplémentaires. c'est à dire.
class Master.Models.Member extends Backbone.Model
urlRoot: '/api/members/'
sync: (method, model, options) ->
params = _.clone options
Backbone.sync method, model, params
J'appelle ça comme ça:
......
remove: ->
@model.destroy
collective_id: the_id
Mon intention là-bas est de passer le Collective_id Param que vous voyez sur le serveur. Mais même si c'est à l'intérieur du hachage d'options pour synchronisation () et je le clonage , il ne se rendra pas au serveur! Comment puis-je envoyer ce paramètre supplémentaire sur le serveur?
(Comme c'est le cas, la seule chose qui atteint le serveur est l'ID du modèle)
Merci d'avance!
Lorsque vous appelez .Destroy (), .fetch () ou .save () Ils appellent tous modèle.sync qui appelle uniquement sworkbone.sync. C'est une fonction proxy. Ceci est destiné à fournir un joli crochet pour modifier le AJAX Comportement d'un modèle unique ou de tout modèles qui s'étendent à partir de ce modèle.
JSON.stringify
Et modifiez le contentType
lorsque vous avez spécifié des données à envoyer avec la demande de suppression. model.destroy()
et éventuellement passer dans un paramètre options
stringify
et contentType
. [.____]Version JavacRipPT
var oldBackboneSync = Backbone.sync;
Backbone.sync = function( method, model, options ) {
// delete request WITH data
if ( method === 'delete' && options.data ) {
options.data = JSON.stringify(options.data);
options.contentType = 'application/json';
} // else, business as usual.
return oldBackboneSync.apply(this, [method, model, options]);
}
Utilisation:
var model, SomeModel = Backbone.Model.extend({ /* urlRoot, initialize, etc... */});
model = new SomeModel();
model.destroy({
data: {
/* data payload to send with delete request */
}
});
Remplacer
// Create your own 'enhanced' model
Backbone.EnhancedModel = Backbone.Model.extend({
destroy: function( options ) {
if ( options.data ) {
// properly formats data for back-end to parse
options.data = JSON.stringify(options.data);
}
// transform all delete requests to application/json
options.contentType = 'application/json';
Backbone.Model.prototype.destroy.call(this, options);
}
});
Utilisation
var model, SomeModel = Backbone.EnhancedModel.extend({ /* urlRoot, initialize, etc... */})
model = new SomeModel();
SomeModel.destroy({
data: {
/* additional data payload */
}
});
Si l'envoi de données avec vos demandes de détruire est une chose isolée, c'est une solution adéquate.
Lorsque vous appelez model.destroy()
Passez dans les options data
et contentType
comme:
Version/utilisation JavaScript
var additionalData = { collective_id: 14 };
model.destroy({
data: JSON.stringify(additionalData),
contentType: 'application/json'
});
Backbone.js fait l'hypothèse ( View Source ) qui supprimer les demandes ne Avoir une charge utile de données.
// delete methods are excluded from having their data processed and contentType altered.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}
Dans leur appel de l'API reposant supposé, les seules données requises sont l'ID qui devrait être annexé à une propriété urlRoot
.
var BookModel = Backbone.Model.extend({
urlRoot: 'api/book'
});
var book1 = new BookModel({ id: 1 });
book1.destroy()
La demande de suppression serait envoyée comme
DELETE => api/book/1
contentType: Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Les paramètres doivent être envoyés dans options.data
, alors essayez:
cafetière
remove: () ->
@model.destroy
data: JSON.stringify
collective_id: the_id,
contentType: 'application/json'
javascript
remove: function() {
return this.model.destroy({
data: JSON.stringify({
collective_id: the_id
}),
contentType: 'application/json'
});
}