backbone.js http-patch

Método de solicitud de PATCH en Backbone.js



http-patch (3)

¿Cuál es la forma correcta de realizar la solicitud de PATCH al guardar los atributos del modelo en Backbone.js?



Además de la respuesta de James Cropchos , quiero agregar lo siguiente, porque esto me roba algunas horas y quizás ayude a alguien más:

Si usa model.save(attributesToPatchObject,{patch: true}) que es posible desde el backbone v.0.9.9 como se indica en la respuesta de James Cropchos, puede preguntarse cómo determinar qué atributos han cambiado desde la última llamada del model.save() para pasarlos como attributesToPatchObject que es el primer argumento de model.save() (o model.fetch() si no ha guardado el modelo últimamente).

La columna vertebral en sí no hacía un seguimiento de esos atributos. Pensé que el método model.changedAttributes() podría encajar, pero como el backbone-doc dice que este método devuelve

un hash de solo los atributos del modelo que han cambiado desde el último conjunto, o falso si no hay ninguno

Así que este método no se ajustaba a esta necesidad. Después de algunas investigaciones, descubrí que el backbone en sí no hacía un seguimiento de los atributos no guardados (lo sé, no es un hallazgo brillante si había leído los documentos más detenidamente).

Descubrí que backbone.trackit es un complemento de backbone que agrega exactamente la característica necesaria al backbone, agregando el método unsavedAttributes() al modelo. La documentación de backbone.trackit dice acerca de este método:

Simétrico al modelo de Backbone.changedAttributes (), excepto que esto devuelve un hash de los atributos del modelo que han cambiado desde la última vez que se guardó, o falso si no hay ninguno. Al igual que los atributos cambiados, se puede pasar un hash de atributos externos, devolviendo los atributos en ese hash que difieren del modelo.

Funciona así:

//fetch an existing model from server model.fetch({ success : function(model, respose, options) { //tell backbone.trackit to track unsaved Attributes model.startTracking(); } }); //now some changes to the model happen model.set("someProperty", "someValue"); /* save the model to server using the PATCH-Method and only send the unsaved Attributes; in this case only "someProperty" is sent */ model.save(model.unsavedAttributes(), {patch: true});

Dado que unsavedAttributes() devuelve falso si no hay atributos no guardados, también puede envolver su declaración save() dentro de una condición if que verifica si unsavedAttributes() devuelve otra cosa que es falsa y solo puede hacer su PATCH-Request si es necesario ( porque algo cambió).

NOTA: no tuvo que llamar a fetch() para usar startTracking() por lo que puede usar este método incluso con los modelos recién creados ( model.isNew() devuelve true en ese modelo), si existe un caso de uso para eso.

Espera que esto pueda ahorrarle a alguien un poco de tiempo de investigación.


Tendrá que anular Backbone.sync y extender el mapeador de métodos existente

var methodMap = { ''create'': ''POST'', ''update'': ''PUT'', ''delete'': ''DELETE'', ''read'': ''GET'', ''patch'': ''PATCH'' };

Tendrás que crear tu propio método de parche en un modelo como

Backbone.Model.prototype.patch = function(options) { // some code here that checks what attributes have changed since last save var xhr = (this.sync || Backbone.sync).call(this, ''patch'', this, options); return xhr; }

Estoy seguro de que puedes ampliar Backbone para incluir OPTIONS y HEAD si lo necesitas

Sin embargo, tenga en cuenta que incluso a través de jQuery es compatible con los métodos PATCH, OPTIONS y HEAD, es posible que el navegador de sus usuarios finales no lo haga.