ExtJS Infinite Scroll Grid с удаленными фильтрами и сортировкой

В ExtJS 4.1 beta 2 мне удалось реализовать сетку бесконечной прокрутки с удаленным хранилищем. Я в основном взял существующую (полностью работоспособную) сетку подкачки (с удаленным хранением, фильтрацией и сортировкой), а затем вставил соответствующие конфигурации для бесконечной прокрутки:

// Use a PagingGridScroller (this is interchangeable with a PagingToolbar)
verticalScrollerType: 'paginggridscroller',
// do not reset the scrollbar when the view refreshs
invalidateScrollerOnRefresh: false,
// infinite scrolling does not support selection
disableSelection: true,   

Это нигде не сказано в документах (см. раздел «Бесконечная прокрутка»), но вам необходимо настроить хранилище на buffered: true config. И вы не можете загрузить с помощью store.load () , это нужно сделать следующим образом:

store.prefetch({
    start: 0,
    limit: 200,
    callback: function() {
        store.guaranteeRange(0, 99);
    }
});   

При всем этом все отлично работает, если я прокручиваю медленно и, таким образом, разрешаю предварительную выборку данных, не так ли? t использовать какие-либо фильтры и не использовать сортировку.

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

Я потратил пару часов на отслеживание кода и поиск в Google, и, помимо вывода о том, что никто не реализовал сетку бесконечной прокрутки с удаленными фильтрами и удаленной прокруткой, я обнаружил следующее:

Фильтрация ломается из-за этого метода в Ext.data.Хранилище , которое вызывается бесконечным скроллером, когда ему требуется больше данных с сервера:

mask: function() {
    this.masked = true;   
    this.fireEvent('beforeload');
},

По какой-то причине этот метод запускает событие beforeload без Параметр Ext.data.Operation , который должен быть его частью, как указано здесь .

В результате возникает ошибка в обработчике onbeforeload в Ext.ux.grid.FiltersFeature , потому что, конечно, «параметры» не определены:

/**
 * @private
 * Handler for store's beforeload event when configured for remote filtering
 * @param {Object} store
 * @param {Object} options
 */
onBeforeLoad : function (store, options) {

    options.params = options.params || {};
    this.cleanParams(options.params);
    var params = this.buildQuery(this.getFilterData());
    Ext.apply(options.params, params);

},

Я могу вырезать вызов этого метода mask из кода PagingScroller, а затем отличная функциональность прокрутки. Я могу прокручивать так быстро, как хочу, и данные загружаются правильно. Но тогда фильтры и сортировка не применяются к запросам ajax.

Я не особо углублялся в аспект сортировки, но я думаю, что это что-то похожее с этим методом маски , потому что sort - это просто еще один элемент, содержащийся в объекте operation , и он вызывает нет объекта операции для передачи в запрос ajax.

Я думаю, если бы я мог просто выяснить, как заставить метод mask запускать beforeload с параметром operation (как в документации положено) все будет нормально. Проблема в том, что я не мог понять, как это сделать.Есть предложения?

Если бы кто-то просто сказал мне, что я ошибаюсь, и люди действительно сделали эту работу, я был бы вдохновлен, но фрагмент любых переопределений, которые вы использовали для решения этой проблемы, или ссылку были бы очень признательны.

Я также пробовал перейти на 4.0.7 и 4.0.2a и получил те же результаты, так что это не просто проблема бета-версии.

Обновление - 7 февраля 12:

Похоже, это может быть проблема Ext.ux.grid.FilterFeature , а не проблема бесконечной прокрутки. Если я удалю конфигурацию FilterFeature, полностью бесконечная прокрутка будет отлично работать и передаст параметры сортировки моему бэкэнду, когда я сортирую по столбцу. Я начну разбираться в том, что касается FilterFeature.

17
задан Brian Tompsett - 汤莱恩 28 October 2019 в 19:33
поделиться