Я наткнулся на этот пост, пытаясь реализовать jScrollPane в сетке extjs 4.0.7
Я не смог найти ничего подходящего, и теперь у меня есть такой ужасный хакерский способ сделать это:
Примените это к вашей конфигурации сетки
scroll: false
А это для модели вашей сетки view
style: {
overflow: 'auto',
'overflow-x': 'hidden'
}
, чтобы отключить внутреннюю прокрутку.
Примените эту функцию к вашей сетке, которая расширяет Ext.grid.Panel
reapplyScrollbar: function () {
var items = $('#' + this.id + ' .x-grid-view');
var broken = $('#' + this.id + ' .jScrollPaneContainer:not(:first-child)');
var unbroken = $('#' + this.id + ' .jScrollPaneContainer:first-child');
console.log('unbroken count=' + unbroken.length);
console.log('removing ' + broken.length + ' broken containers');
broken.remove();
// grid resized so scroller must be removed
if (items.parent().is('.jScrollPaneContainer') && items[0].parentNode.clientHeight != items[0].clientHeight) {
console.log('moving el up to grid body');
var container = items.parent();
var gridBody = items.parent().parent();
gridBody.append(items);
container.remove();
if (items[0].parentNode.clientHeight != items[0].clientHeight || items[0].parentNode.clientWidth != items[0].clientWidth) {
items[0].style.height = items[0].parentNode.clientHeight + 'px';
items[0].style.width = items[0].parentNode.clientWidth + 'px';
console.log('moved el and reset height & width');
}
} else if (items.length > 0 && items[0].clientHeight > 0 && unbroken.length == 0) {
if (items[0].parentNode.clientHeight != items[0].clientHeight) {
items[0].style.height = items[0].parentNode.clientHeight + 'px';
items[0].style.width = items[0].parentNode.clientWidth + 'px';
console.log('reset height & width');
}
console.log('applying scroll');
items.jScrollPane();
items[0].style.top = "";
}
}
Общая идея заключается в том, что макет вызывается слишком много раз, чтобы знать, что происходит внутри, поэтому мы проверим состояние вида сетки. Если представление сетки имеет другую высоту по отношению к своему контейнеру, тогда jScrollPane необходимо повторно применить (и удалить старый). Внутри происходит что-то, что означает, что jScrollPane
становятся осиротевшими, поэтому мы удаляем осиротевших.
Когда записи магазина добавляются и удаляются, я также звоню reapplyScrollbar
.
Естественно, хотя это работает, это очень противно. В конце концов я сделаю это где-нибудь глубже, изменив визуализованную разметку.