Загрузка дополнительных модов с сервера с помощью Paginator.clientPager

Я пытаюсь загрузить дополнительные модалы с сервера после начальной загрузки с Paginator.clientPager

Это моя коллекция, скопированная с примера кода на github.

return new (Backbone.Paginator.clientPager.extend({
    model: model,
    paginator_core: {
        type: 'GET',
        dataType: 'json',
        url: '/odata/LibraryFile'
    },

    paginator_ui: {
        // the lowest page index your API allows to be accessed
        firstPage: 1,

        // which page should the paginator start from
        // (also, the actual page the paginator is on)
        currentPage: 1,

        // how many items per page should be shown
        perPage: 2,

        // a default number of total pages to query in case the API or
        // service you are using does not support providing the total
        // number of pages for us.
        // 10 as a default in case your service doesn't return the total
        totalPages: 5
    },

    server_api: {
        // number of items to return per request/page
        '$skip': function () { return this.perPage * (this.currentPage - 1) },
        '$top': function () { return this.perPage },
    },

    parse: function (response) {
        console.log(response);
        return response.value;
    }
}))();

Я называю начальную выборку так

myCollection.fetch({
    success: function(){
        myCollection.pager();
    },
    silent:true
});

Затем, после того как пользователь просмотрит локальные страницы с помощью clientPager, он, вероятно, захочет загрузить больше страниц, не удаляя первые страницы.

Я пытаюсь добиться этого, но по какой-то причине, после того, как я позвоню pager(); 2 новые записи удалены.

myCollection.currentPage = 2;
myCollection.fetch({
    success: function(){ 
        console.log(myCollection.length) // 4 models, with correct data
        myCollection.pager();
        console.log(myCollection.length) // the 2 new records are removed
    },
    silent:true,
    remove: false // don't remove old records
});

Что я делаю не так, как я могу загрузить еще 2 страницы с Paginator.clientPager?

Я не хочу использовать requestPager, потому что тогда я не могу делать предварительное кеширование памяти, по крайней мере, я думаю.

1 ответ

По моему опыту, это вызвано методом pager() метода Backbone.Paginator.clientPager. Вы можете посмотреть на код здесь: Backbone.Paginator.clientPager

Строки с 292 по 294 показывают, что Backbone.Paginator.clientPager.origModels назначается только текущим моделям (длина которых вы правильно протестировали на своих рисунках выше), если она не определена. Проблема в том, что к тому времени, когда пользователь, вероятно, захочет загрузить больше страниц, не удаляя первую, свойство origModels уже будет установлено в результате первоначальной выборки.

Это означает, что вам придется явно сделать origModels неопределенным снова, прежде чем pager() будет работать так, как вы хотите. Обратите внимание, что происходит позже в строке 296 исходного кода (для моделей назначается копия origModels). Вот почему ваши две новые записи были удалены. Следующий код должен работать так, как вы хотели:

myCollection.currentPage = 2;
myCollection.fetch({
    success: function(){ 
        delete myCollection.origModels; // to ensure that origModels is overridden in pager() call below
        myCollection.pager();
    },
    silent:true,
    remove: false // don't remove old records
});
Другие вопросы по тегам