В моем приложении, я обратился к перезагрузкам вопроса, добавив новый метод, называемый 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;
}
})
}
}
});
Спасибо за ссылку на запрос Pull – peter