Pregunta

Decir que tengo una Colección y he hecho cambios a muchos de sus Modelos.¿Cuál es la mejor manera de guardar todos los cambios en el uso de una sola petición HTTP?

¿Fue útil?

Solución

Generalmente reposar los billetes de la creación / actualización de la instancia única.Tendría que cambiar eso para aceptar una matriz de objetos.

Dicho esto, en el lado del cliente, tendría que 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 de jQuery AJAX (error, éxito, etc.)

Otros consejos

Voy a hacer lo Malo aquí y cito de Wikipedia con respecto a adecuado Descanso prácticas:un PONER a example.com/resources debe reemplazar la colección completa con otra colección.Basado en esto, cuando teníamos para apoyar la edición de varios elementos al mismo tiempo, hemos escrito hasta el presente contrato.

  1. El cliente envía {"resources": [{resource1},{resource2}]}
  2. El servidor sustituye toda la colección con la nueva información del cliente, y devuelve la información después de que se haya persistido: {"resources": [{"id":1,...},{"id":2,...}]}

Escribimos el servidor de la mitad del contrato en Rails, pero aquí está el cliente de la mitad (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 un mucho más fácil de implementar, a continuación, reemplazar la columna vertebral.la sincronización.Uno de los comentarios en el código, nuestras colecciones siempre fueron objetos secundarios que debe explicar por qué el código establece un "parent_id" siempre que un objeto se añade a la colección, y cómo la raíz de la URL es el padre de la URL.Si usted tiene el nivel raíz de las colecciones que desea modificar y, a continuación, sólo hay que quitar la @parent de negocios.

Debe extender Backbone.Collection, lo que le da un método save() que comprobaría cada uno de sus modelos hasChanged().

Luego, debe llamar a Backbone.sync, que probablemente tenga que extender un poco a una función de sincronización personalizada.Si usa una función personalizada Backbone.sync, 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
    }
});

Un enfoque diferente (usar un modelo para representar la colección) está aquí: " "¿Cómo" para guardar una colección completa en backbone.js - backbone.sync o jquery.ajax?

También me gusta https://stackoverflow.com/a/7986982/137067

Este código agrega un nuevo método al prototipo de cobro solo para llamar al método GUARDOR de esos modelos que habían cambiado.Funcionó para mí:

Backbone.Collection.prototype.saveAll = function(options) {
 return $.when.apply($, _.map(this.models, function(m) {
   return m.hasChanged() ? m.save(null, options).then(_.identity) : m;
 }));
};

GIST Link: https://gist.github.com/julianitor/701c677279bac1529b88

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top