2015-03-31 6 views
1

У меня есть коллекция объектов, которые будут обновляться навалом (не обязательно все в то же время, но более одного).Backbone.js обновление коллекции навалом

Поэтому мне нужно отправлять обновления на сервер в массовом порядке (то есть не один запрос для каждого обновленного объекта), и мне нужно делать частичные обновления (т. Е. Только обновлять объекты, которые изменились).

Проблемы я наткнулась:

  1. Там нет save() метода на коллекции (странно, учитывая, что есть fetch() метод)
  2. Там нет встроенной в отслеживании моделей, которые были изменены в коллекции начиная с последней синхронизации с сервером.

Есть ли чистый, элегантный способ достичь этого?

Я исследовал и пробовал несколько вещей, но все решения довольно неприятные и чрезмерно сложные - что неприемлемо для рамки, предназначенной для упрощения такого рода вещей.

Конечно, есть достойный способ сделать такое обычное дело в магистрали. Или я должен использовать другую структуру, например. Угловая JS?

+0

Почему вам нужно обновить элементы коллекции навалом? Могут ли они быть изменены ** в то же время ** в вашем приложении? Если нет, то обычной практикой является вызов метода 'save' модели, как только какой-либо элемент будет изменен. – hindmost

+0

@hindmost да, они могут быть изменены в одно и то же время. Существует список элементов с флажками для выбора элементов, и пользователь может выполнять изменения во всех выбранных элементах одновременно (например, изменение состояния 10 элементов одновременно - я не хочу, чтобы мой сервер получал 10 аякс-запросов для этого) – developerbmw

+0

Затем вам определенно нужно изменить структуру данных приложения. Вы не должны создавать коллекцию на модели, содержащей одно логическое значение (checkbox checked state). Вместо использования коллекции в вашем случае лучше использовать одиночную модель, содержащую множество состояний флажков. – hindmost

ответ

1

Вы можете просто построить массив JSON-представлений моделей. Что-то вроде этого.

Backbone.Collection.prototype.save = function() 
{ 
    var data = []; 
    for (var n = 0; n < this.length; ++n) 
    { 
     data.push(this.models[n].toJSON()); 
    } 

    // save data through jQuery 
    console.log(data); 
}; 

var col = new Backbone.Collection(); 
col.add({status: true}); 
col.add({status: false}); 
col.save(); 

Вы можете добавить model.hasChanged() проверку, чтобы предотвратить излишние сбережения.

+0

Спасибо @joconja. Это выглядит хорошо. Я попробую и посмотрю, как это происходит. – developerbmw

0

Просто, чтобы помочь всем, кто находит этот вопрос, это то, что я в конечном итоге с помощью (на основе ответа @ joconja в):

Backbone.Collection.prototype.saveChanges = function() { 
    var data = []; 

    for (var i = 0; i < this.length; ++i) { 
     if (this.models[i].hasChanged()) { 
      var changes = this.models[i].changedAttributes(); 
      changes.id = this.models[i].get('id'); 
      data.push(changes); 
      this.models[i].changed = {}; 
     } 
    } 

    Backbone.ajax({ 
     url: this.url, 
     method: 'PUT', 
     contentType: 'application/json', 
     data: JSON.stringify(data) 
    }); 
}; 
Смежные вопросы