2012-01-24 5 views
4

У меня есть коллекция, которая потенциально может содержать тысячи моделей. У меня есть представление, которое отображает таблицу с 50 строками для каждой страницы.коллекции и обновления кэша backbone.js

Теперь я хочу, чтобы иметь возможность кэшировать мои данные, чтобы пользователь загружал страницу 1 таблицы, а затем нажимал на странице 2, данные для страницы 1 (строки # 01-50) будут кэшироваться так, что когда пользователь снова нажимает на стр. 1, магистраль не должна будет ее снова извлекать.

Кроме того, я хочу, чтобы моя коллекция могла обновлять обновленные данные с сервера без выполнения RESET, так как RESET удалит все модели в коллекции, включая ссылки на существующую модель, которая может существовать в моем приложении. Можно ли получать данные с сервера и обновлять или добавлять новые модели, если необходимо, путем сравнения существующих данных и новых поступающих данных?

ответ

7

В моем приложении, я обратился к перезагрузкам вопроса, добавив новый метод, называемый fetchNew:

app.Collection = Backbone.Collection.extend({ 

    // fetch list without overwriting existing objects (copied from fetch()) 
    fetchNew: function(options) { 
     options = options || {}; 
     var collection = this, 
      success = options.success; 
     options.success = function(resp, status, xhr) { 
      _(collection.parse(resp, xhr)).each(function(item) { 
       // added this conditional block 
       if (!collection.get(item.id)) { 
        collection.add(item, {silent:true}); 
       } 
      }); 
      if (!options.silent) { 
       collection.trigger('reset', collection, options); 
      } 
      if (success) success(collection, resp); 
     }; 
     return (this.sync || Backbone.sync).call(this, 'read', this, options); 
    } 

}); 

Это в значительной степени идентично стандартной fetch() методы, для условного оператора проверки существования элемента, за исключением, и используя add() по умолчанию, а не reset. В отличие от простого прохождения {add: true} в аргументе options, он позволяет извлекать наборы моделей, которые могут пересекаться с тем, что вы уже загрузили - с помощью {add: true} выдается ошибка, если вы попытаетесь добавить одну и ту же модель дважды.

Это должно решить вашу проблему с кешированием, если ваша коллекция настроена так, что вы можете передать какой-то параметр page в options, чтобы сообщить серверу, какую страницу параметров отправить назад. Возможно, вы захотите добавить какое-то структуры данных в вашей коллекции, чтобы отслеживать, какие страницы вы загрузили, чтобы не делать лишние запросы, например:

app.BigCollection = app.Collection.extend({ 

    initialize: function() { 
     this.loadedPages = {}; 
    }, 

    loadPage: function(pageNumber) { 
     if (!this.loadedPages[pageNumber]) { 
      this.fetchNew({ 
       page: pageNumber, 
       success: function(collection) { 
        collection.loadedPages[pageNumber] = true; 
       } 
      }) 
     } 
    } 

}); 
7

Backbone.Collection.fetch имеет возможность {add: true}, которая добавит модели в коллекцию вместо замены содержимого.

myCollection.fetch({add:true}) 

Итак, в вашем первом сценарии элементы из страницы2 будут добавлены в коллекцию.

Что касается вашего второго сценария, в настоящее время нет встроенного способа сделать это.

According to Jeremy Это то, что вы должны делать в своем приложении, а не в составе базовой линии.

Смазка, кажется, имеет ряд проблем при использовании для совместных приложений, где другой пользователь может обновлять модели, на которых у вас есть клиентская сторона. У меня возникает ощущение, что Джереми, похоже, сосредоточился на однопользовательских приложениях, и приведенная выше дискуссия по билетам иллюстрирует это.

В вашем случае простейший способ справиться со вторым сценарием - перебрать вашу коллекцию и вызвать fetch() для каждой модели. Но это не очень хорошо для производительности.

Для лучшего способа сделать это, я думаю, вам придется переопределить collection._add и спуститься по линии dalesons на этом pull request.

+0

Спасибо за ссылку на запрос Pull – peter

1

мне удалось получить update в Backbone 0.9.9 ядра , Проверьте это, так как это именно то, что вам нужно http://backbonejs.org/#Collection-update.

+0

недостающие документы. я не могу найти его – Muhaimin

+0

Начиная с версии 1.0.0 'Collection # update' был переименован в' Collection # set'. –

Смежные вопросы