Как сохранить коллекцию с помощью backbone.js - PullRequest
7 голосов
/ 02 ноября 2011

У меня есть иерархия категорий.Я использую библиотеку jquery для иерархии, чтобы все перемешалось так, как хочет пользователь.Затем они нажимают сохранить.Таким образом, исходная иерархия и сохраняемая иерархия могут быть совершенно разными.

Иерархия представлена ​​в виде коллекции, и я использую parentIds для построения дерева с использованием тегов ol и li.

Когда пользовательнажимает сохранить, затем мне нужно обновить все элементы в коллекции с их новым parentId и синхронизировать каждый из них с сервером.

Мне интересно, есть ли у кого-нибудь какие-либо советы о том, как действовать здесь.Я видел в документации для Backbone.sync: «Используйте setTimeout для пакетирования быстрых обновлений в один запрос». Поэтому, если я правильно понял, я бы поставил в очередь каждый из вызовов Backbone.sync изатем использовать setTimeout, чтобы через несколько секунд отправить мою очередь на сервер?

Кроме того, если я переписываю Backbone.sync, разве мне не нужен метод save где-нибудь для коллекции, которая будет анализировать json?ответа (ответ сервера должен был бы отправить обратно список объектов), а затем вызвать model.set для каждого элемента в коллекции?У кого-нибудь есть пример кода?

Спасибо!

Ответы [ 2 ]

21 голосов
/ 03 ноября 2011

В итоге я применил метод updateAll в своей модели коллекции. Это сработало как сон:

Domain.PageList = Backbone.Collection.extend({  
  model: Domain.Page,   
  url: '_domainController/PageListController',
  comparator: function(page) {
    return page.get('ordering');
  },

  updateAll: function() {
    var collection = this;
    options = {
      success: function(model, resp, xhr) {
        collection.reset(model);
      }
    };
    return Backbone.sync('update', this, options);
  }
});

На сервере (я использую PHP) я просто получаю данные и сохраняю их в своей базе данных и возвращаю новую коллекцию в формате JSON.

6 голосов
/ 02 ноября 2011

Я не уверен, что полностью понимаю контекст. Это примерно так: у вас есть одна коллекция со всеми категориями, и вы сохраняете иерархию, используя свойство parentId. Пользователь меняет иерархию, а затем вы хотите сохранить иерархию (неявно сохранить коллекцию, которая теперь содержит другие parentId).

Если это правильно, я бы сделал следующее:

  • делает действие PUT / category, которое принимает хэш {id: parentId} и обновляет все категории с этими данными.
  • при сохранении я бы назвал Backbone.sync('update', categories_collection, {data: a_hash_of_{id:parent_id}, success: your_success_callback). Это должно работать без каких-либо других переопределений, если вы указали url для своих категорий и в случае обратного вызова успеха вы можете просто сбросить коллекцию с новыми данными.

Это не полный REST, но преимущество в том, что он запускает только один запрос на обновление независимо от того, сколько у вас категорий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...