Mejores prácticas para el ahorro de toda una colección?
-
14-11-2019 - |
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?
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.
- El cliente envía
{"resources": [{resource1},{resource2}]}
- 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