Как сообщить магазину, какая страница была загружена - PullRequest
1 голос
/ 21 сентября 2011

У меня есть магазин, привязанный к сетке. Когда он загружен, он имеет n страниц.

Теперь я хочу показать страницу, которая содержит определенное значение. Для этого я использую store.load({params: {'file': 'file33939'}}); («файл» используется, потому что сетка показывает список файлов, но это не имеет отношения к вопросу). В данный момент я не знаю, что это за страница. Ответ выглядит так:

{
  "files":[{"id":"33939", "name": "file33939"}, /* ... */],
  "total": 1000,
  "page": 13
}

Сетка отображает правильные данные (страница, которая действительно содержит 'file33939'). Однако pagingtoolbar , rownumberer сетки и store.indexOfTotal () ведут себя так, как если бы была загружена первая страница (вместо 13).

Как я могу "сказать" магазину, что страница, которую он только что загрузил, составляет 13?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Для изменения загруженной страницы не следует использовать store.load().Вы должны найти способ получить номер страницы для данных (например, запросить сервер с помощью запроса ajax), а затем обновить страницу с помощью pagingtoolbar.move(pageNumber).Это обновит ваш pagingtoolbar вместе с сеткой и магазином, и все останется синхронизированным.

0 голосов
/ 22 сентября 2011

Я нашел подходящее решение.Это не самое элегантное решение.Однако это работает.

После копания в коде sencha я обнаружил, что pagingtoolbar и store.indexOfTotal () использовали record.index (что в моем случае былоустановить, как будто первая страница была загружена).record.index устанавливается в функции store store.loadRecords:

loadRecords: function(records, options) {
    // ...
    //FIXME: this is not a good solution. Ed Spencer is totally responsible for this and should be forced to fix it immediately.
    for (; i < length; i++) {
        if (options.start !== undefined) {
            records[i].index = options.start + i;

        }
    // ...
},

Комментарий FIXME не мой.Это было в коде.

Идеальным решением было бы найти событие, которое запускается после получения ответа и до вызова loadRecords, и переопределить options в обработчике.Однако я не нашел такого события.

Но вы всегда можете переопределить loadRecords:

Ext.define('MyApp.store.MyStore', {
    extend          : 'Ext.data.Store',
    // ...
    loadRecords     : function(records, options) {
        if (this.proxy.reader.rawData.page) {
            var page = this.proxy.reader.rawData.page;

            // This is for pagingtoolbar
            this.currentPage = page;

            // The following is for rownumberer and correct index behaviour
            options.page = page;
            options.start = (page-1)*options.limit;
        }
        this.callParent(arguments);
    },
    // ...
});
...