Изменение полос прокрутки в ExtJs

Я использую ExtJs и пытаюсь изменить внешний вид полос прокрутки по умолчанию (для панели сетки).

Я пытался использовать jScrollPane, но он вообще не работает с ExtJs.

Есть ли способ изменить внешний вид полос прокрутки по умолчанию в ExtJS. Я не хочу, чтобы он был похож на jScrollPane

Спасибо!


person mikipero    schedule 24.11.2011    source источник
comment
Взгляните на эту панель www.sencha.com/forum/showthread.php?56199-Scrollbar-to-the-ExtJS.   -  person Davor Zubak    schedule 25.11.2011


Ответы (2)


Я наткнулся на этот пост, пытаясь реализовать jScrollPane в сетке extjs 4.0.7.

Я не мог найти ничего другого подходящего, и теперь у меня есть этот ужасный хакерский способ сделать это:

Примените это к вашей конфигурации сетки

scroll: false

И это для вашей сетки viewModel

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.

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

person Skym    schedule 17.01.2012
comment
не могли бы вы уточнить места, где вы вызываете эту функцию reapply? Я имею в виду, где вы это называете? Сколько раз? - person Saeed Neamati; 28.11.2012

Мне удается использовать jscrollpane с extJs GridPanel.

В прослушивателе рендеринга Grid Panel я поставил

$(function(){
    $('.x-grid3-scroller').jScrollPane();
});
person mikipero    schedule 25.11.2011