Как обновить всю коллекцию Backbone.js, которая находится в базе данных?
У меня есть коллекция (список объектов) в базе данных. Я могу получить это как: collectionModel.fetch()
Но затем пользователь что-то меняет в этой коллекции. Когда пользователь нажимает кнопку "Сохранить", весь список коллекций должен обновляться в базе данных. Я думал, может быть, я могу delete()
сначала старый, а потом create()
это с новым, но я не мог достигнуть этого. Я не могу использовать update()
метод, потому что в этом случае я должен найти, какие элементы коллекции изменились, но я хочу обновить весь список. Как я могу это сделать? Спасибо за помощь.
2 ответа
У вас есть REST API перед этой базой данных? Вот как Backbone сделан для работы. Когда ваш код JavaScript работает model.save();
запрос PUT сделан к вашему API для этой модели.
Вы задаете вопрос о сохранении всей коллекции, для этого, если вы хотите остаться в рамках реализации Backbone по умолчанию, вам придется просмотреть все модели в коллекции и вызвать save для каждой из них.
Если вы хотите сделать один единственный запрос к вашему серверу, вам придется реализовать собственный метод внутри вашей коллекции. Что-то вроде:
MyCollection = Backbone.Collection.extend({
saveAll: function() {
var data = this.toJSON();
return Backbone.$.ajax({
data: { objects: data },
url: '/url/in/your/server/to/update/db'
});
}
});
Это отправит массив всех моделей в вашей коллекции, преобразованный в JSON, на ваш сервер.
Опять же, вы хотите иметь RESTful API на стороне сервера, если хотите упростить свою жизнь с Backbone.
Если вы хотите сбросить коллекцию, вы должны указать атрибут "сбросить".
collectionList.fetch({
reset: true,
...
});
Но я думаю, что лучше просто обновить его:
collectionList.fetch({
remove: false,
update: true,
merge: true,
...
});
This is a very old question, but I had another approach so I thought I'd post it.
Sometimes my collections have a lot of data and the server doesn't get it all. I solved this by using one of the underscore methods that backbone collections have, invoke
(also relies on jquery):
MyCollection = Backbone.Collection.extend({
update: function(callback) {
// Invoke the update method on all models
$.when.apply($, this.invoke('update')).then(() => {
// After complete call the callback method (if passsed)
if(callback) {
callback();
}
});
}
});
You can use it by calling collection.update()
when the collection has models in it. A similar method can be used for creating or deleting collections, and this should be modifiable to catch errors but I didn't account for that.