Backbone.js кэш коллекции и обновления - PullRequest
4 голосов
/ 24 января 2012

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

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

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

Ответы [ 3 ]

6 голосов
/ 25 января 2012

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

}); 
6 голосов
/ 24 января 2012

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

myCollection.fetch({add:true})

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

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

Согласно Джереми это то, что вы должны делать в своем приложении, а не часть Backbone.

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

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

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

1 голос
/ 18 декабря 2012

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

...