javascript backbone.js

javascript - ¿Cuál es la forma menos fea de forzar las actualizaciones de Backbone.sync para usar POST en lugar de PUT?



backbone.js (5)

Algunos de mis modelos Backbone siempre deben usar POST, en lugar de POST para crear y PUT para actualizar. El servidor al que persisto estos modelos es capaz de soportar todos los demás verbos, por lo que usar Backbone.emulateHTTP tampoco es una solución perfecta.

Actualmente isNew método isNew para estos modelos y lo devuelvo true , pero esto no es ideal.

Además de modificar directamente el código backbone.js, ¿hay alguna manera simple de lograr este objetivo modelo por modelo? Algunos de mis modelos pueden usar PUT (se conservan en un servidor diferente que admite todos los verbos, incluido PUT), por lo que reemplazar Backbone.sync con uno que convierta el método de ''actualización'' en ''crear'' tampoco es ideal.


agregue una sincronización (método, modelo, [opciones]) directamente a sus modelos que necesita anular.

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

Aquí hay más información: http://documentcloud.github.com/backbone/#Sync


Corto y dulce es poner esto en la parte superior

Backbone.emulateHTTP = true;

Esto utilizará Get for Pull y Post for All (lea Crear, Actualizar, Eliminar)


la forma en que lo hice es anular la sync() así

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: { ...


Usé una modificación de la respuesta de Andres y en lugar de recordar pasar la opción { type: ''post'' } todas partes a las que llamo .save() En su lugar, simplemente reemplacé la función de save en el modelo para que siempre agregue esa opción luego llama a la implementación base. Se sentía más limpio ...

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


Para cualquiera que necesite forzar una solicitud POST / PUT en la instancia directamente:

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