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?
A partir de Backbone.js v0.9.9, simplemente puede pasar { patch: true }
a save()
.
Leer más: http://backbonejs.org/#changelog
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.