Как обновить всю коллекцию 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.

Другие вопросы по тегам