В 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.