Quelle est la manière la moins moche de forcer les mises à jour Backbone.sync pour utiliser POST au lieu de PUT?

Certains de mes modèles Backbone devraient toujours utiliser POST, au lieu de POST pour créer et PUT pour la mise à jour. Le serveur auquel je persiste ces modèles est capable de supporter tous les autres verbes, donc l'utilisation de Backbone.emulateHTTP n'est pas une solution parfaite non plus.

Actuellement, je remplace la méthode isNew pour ces modèles et je le retourne true , mais ce n'est pas idéal.

Outre la modification du code backbone.js directement, existe-t-il un moyen simple d'atteindre cet objectif sur une base modèle par modèle? Certains de mes modèles peuvent utiliser PUT (ils sont conservés sur un serveur différent qui prend en charge tous les verbes, y compris PUT), donc le remplacement de Backbone.sync par celui qui convertit la méthode 'update' en 'create' n'est pas non plus idéal.

Ajoutez une synchronisation (méthode, modèle, [options]) directement à vos modèles, vous devez passer outre.

 YourModel = Backbone.Model.extend({ sync: function(method, model, options) { //perform the ajax call stuff } } 

Voici quelques informations supplémentaires: http://documentcloud.github.com/backbone/#Sync

Pour quiconque doit forcer directement une requête POST / PUT sur l'instance:

 thing = new ModelThing({ id: 1 }); thing.save({}, { // options type: 'post' // or put, whatever you need }) 

Short and Sweet est mis sur le dessus

 Backbone.emulateHTTP = true; 

Cela utilisera les pousses Get for Pull et Post for All (lire Create, Update, Delete)

La façon dont je l'ai fait est d'annuler la sync() ainsi

 Models.Thing = Backbone.Model.extend({ initialize: function() { this.url = "/api/thing/" + this.id; }, sync: function(method, model, options) { if (method === "read") method = "create"; // turns GET into POST return Backbone.sync(method, model, options); }, defaults: { ... 

J'ai utilisé une modification de la réponse d'Andres et au lieu de ne pas oublier de passer l'option { type: 'post' } partout où j'appelle .save() Je .save() plutôt la fonction de save sur le modèle pour l'ajouter toujours cette option Puis appelez l'implémentation de base. C'était plus propre …

 module.exports = Backbone.Model.extend({ idAttribute: 'identifier', urlRoot: config.publicEndpoint, save: function (attributes, options) { // because the 'identifier' field is filled in by the user, Backbone thinks this model is never new. This causes it to always 'put' instead of 'post' on save. // overriding save here to always pass the option use post as the HTTP action. options = _.extend(options || {}, { type: 'post' }); return Backbone.Model.prototype.save.call(this, attributes, options); } });