В 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,
Он не говорит об этом нигде в docs (см. раздел "Бесконечная прокрутка" ), но вам нужно установить для вашего магазина конфигурацию buffered: true
. И вы не можете загрузить с помощью store.load()
, это нужно сделать следующим образом:
store.prefetch({
start: 0,
limit: 200,
callback: function() {
store.guaranteeRange(0, 99);
}
});
При всем этом все отлично работает, если я медленно прокручиваю и, таким образом, позволяю данные предварительно выбирать, не использовать какие-либо фильтры и не использовать сортировку.
Однако, если я быстро прокручиваю или пытаюсь перезагрузить бесконечную сетку прокрутки с активным фильтром или при сортировке все это разрывается. Ошибка options is undefined
.
Я потратил пару часов на выполнение некоторых трассировок кода и googling, и кроме того, что никто не реализовал бесконечную сетку прокрутки с удаленными фильтрами и удаленной прокруткой, я нашел следующее:
Фильтрация разрушается из-за этого метода в Ext.data.Store
, который вызывается бесконечным скроллером, когда ему требуется больше данных с сервера:
mask: function() {
this.masked = true;
this.fireEvent('beforeload');
},
По какой-то причине этот метод запускает событие beforeload
без параметра Ext.data.Operation
, который должен быть частью его, как указано здесь.
В результате в обработчике onbeforeload
в Ext.ux.grid.FiltersFeature
возникает ошибка, поскольку, конечно, "параметры" - это undefined:
/**
* @private
* Handler for store 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.