BackboneJS: Загрузить больше предметов в коллекцию - PullRequest
8 голосов
/ 13 октября 2011

В Backbone JS, когда я выбираю коллекцию, должен ли я получать всю коллекцию или ее небольшую часть?

Например, у меня есть коллекция новостных лент в mongoDB, которая может содержать потенциально 1000 элементов.Когда пользователь заходит на страницу, я хочу показать ему только последние 10 элементов с возможностью «Загрузить еще».Но если они посещают определенный элемент по URL http://site.com/#/feed/:itemID, я хочу иметь возможность просмотреть запись этого элемента.

1.Сколько документов я должен получить изначально?

2.Как бы я мог получить любой предмет по идентификатору?

Ответы [ 3 ]

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

В итоге я использовал оператор {add: true} при вызове fetch для своей коллекции. Это предотвращает замену коллекции результатом выборки и вместо этого добавляет результат в коллекцию. Затем я также передал сумму 'skip' с помощью {data: {skip: amountOfItemsInCollectionAlready }, это используется на стороне сервера для получения правильной партии элементов из базы данных.

Мой метод последней выборки выглядит так:

    loadMore: function(e){

        this.collection.fetch({
            add: true,// this adds to collection instead of replacing
            data:{// this is optional params to be sent with request
                skip: this.collection.length// skip the number of items already in the collection
            }
        });
    }
5 голосов
/ 13 октября 2011

Вы, вероятно, не хотите просто использовать Collection.fetch(), потому что вы не получите преимущества кэширования на стороне клиента - он отбросит элементы, которые вы уже загрузили с сервера, и сбросит коллекцию.Вам, вероятно, потребуется расширить Backbone.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) {
                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(), но вместо удаления существующих элементов он добавляет новые.Возможно, вы захотите реализовать что-то на стороне сервера, используя объект options, так как Julien предлагает передать параметры того, какие элементы вы хотите загрузить, возможно, либо номер страницы (если вы хотите контролировать размер страницы насервер) или пара старт-стоп (если вы хотите управлять им на клиенте).

3 голосов
/ 13 октября 2011

1 - Вы должны получить 10

Добавить аргумент страницы в свою коллекцию и получить код бэкэнда, возвращающий соответствие страницы (10 / page)./ my_objects? page = 2 для получения записей 10-20 и т. д.

Вы делаете это следующим образом (не проверено):

collection.fetch({data: {page:2}})

Или вы напрямую изменяете URL

2 - Чтобы выбрать элемент по идентификатору, вы создаете модель

object = new Model({id: 1})

и извлекаете ее

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