В 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
. И вы не можете загрузить с store.load()
, это нужно сделать так:
store.prefetch({
start: 0,
limit: 200,
callback: function() {
store.guaranteeRange(0, 99);
}
});
При всем этом все работает отлично, если я прокручиваю медленно и, таким образом, позволяю данным предварительно выбирать, не использовать фильтры и не использовать сортировку.
Однако, если я прокручиваю быстро или пытаюсь перезагрузить бесконечную сетку прокрутки с активным фильтром или во время сортировки все разрывается. Ошибка options is undefined
.
Я потратил пару часов на то, чтобы провести некоторую трассировку в коде и поиск в Google. Кроме того, я пришел к выводу, что никто не реализовал бесконечную сетку прокрутки с удаленными фильтрами и удаленной прокруткой:
Фильтрация прерывается из-за этого метода в Ext.data.Store
, который вызывается бесконечным скроллером, когда ему требуется больше данных с сервера:
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.
Я не слишком углубился в аспект сортировки, но я думаю, что это похоже на метод mask
, потому что sort - это просто еще один элемент, содержащийся в объекте operation
, и он вызывает операцию no объект для передачи в запрос ajax.
Я думаю, что если бы я мог просто выяснить, как заставить метод mask
запускать beforeload
с параметром operation
(как говорят в документации, то все будет хорошо). Проблема в том, что я не смог понять, как это сделать. Есть предложения?
Если кто-то просто скажет мне, что я неправ, и люди действительно сделали эту работу, я был бы вдохновлен, но фрагмент любых переопределений, которые вы использовали для решения этой проблемы или ссылки, был бы очень признателен.
Я также пытался перейти на 4.0.7 и 4.0.2a и получаю те же результаты, так что это не просто проблема с бета-версией.
Обновление - 7 февраля, 12:
Кажется, это может быть проблема Ext.ux.grid.FilterFeature
, а не проблема бесконечной прокрутки. Если я удаляю конфигурацию FilterFeature, то бесконечная прокрутка прекрасно работает и передает параметры сортировки моему бэкэнду, когда я сортирую по столбцу. Я начну изучать конец FilterFeature.