Decir que tengo una Colección y he realizado cambios en muchos de sus Modelos. ¿Cuál es la mejor manera de guardar todos los cambios usando una sola solicitud HTTP?
Por lo general, los backends REST manejan la creación/actualización de una sola instancia. Debería cambiar eso para aceptar una matriz de objetos.
Dicho esto, en el lado del cliente, deberá ir directamente a la función Backbone.sync
Backbone.sync = function(method, model, options)En este caso, su modelo debe ser una matriz de modelo. El método debe ser "crear" o "guardar" y las opciones toman el mismo tipo de opciones que una llamada jQuery ajax (error, éxito, etc.)
Voy a hacer lo incorrecto aquí y citaré Wikipedia con respecto a las prácticas RESTful adecuadas : un PUT a example.com/resources debería reemplazar la colección completa con otra colección. En base a esto, cuando tuvimos que admitir la edición de varios elementos simultáneamente, redactamos este contrato.
{"resources": [{resource1},{resource2}]}{"resources": [{"id":1,...},{"id":2,...}]}Escribimos la mitad del contrato del servidor en Rails, pero aquí está la mitad del cliente (¡en CoffeeScript, lo siento!):
class ChildElementCollection extends Backbone.Collection initialize: -> @bind 'add', (model) -> model.set('parent_id', @parent.id) url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1' save: -> response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON())) response.done (models) => @reset models.resources Pensé que esto era mucho más fácil de implementar que anular Backbone.sync. Un comentario sobre el código, nuestras colecciones siempre fueron objetos secundarios, lo que debería explicar por qué el código establece un "parent_id" cada vez que se agrega un objeto a la colección, y cómo la raíz de la URL es la URL principal. Si tiene colecciones de nivel raíz que desea modificar, simplemente elimine el negocio @parent .
Debería extender Backbone.Collection , dándole un método save() que verificaría cada uno de sus modelos hasChanged() .
Luego debería llamar a Backbone.sync , que probablemente tendrá que extender un poco a una función de sincronización personalizada. Si utiliza una función Backbone.sync personalizada, asegúrese de configurarla en su colección.
var CollectionSync = function(method, model, [options]) { // do similar things to Backbone.sync } var MyCollection = Backbone.Collection.extend({ sync: CollectionSync, model: MyModel, getChanged: function() { // return a list of models that have changed by checking hasChanged() }, save: function(attributes, options) { // do similar things as Model.save } });Aquí hay un enfoque diferente (usando un modelo para representar la colección): "¿Cómo" guardar una colección completa en Backbone.js - Backbone.sync o jQuery.ajax?
También me gusta https://stackoverflow.com/a/7986982/137067