Как перестать прокручивать вверх, когда перезагрузка магазина сетки - взять 2 - PullRequest
1 голос
/ 17 мая 2019

У меня есть приложение, которое использует ExtJS 3.3.0. Он использует EditorGridPanel, в котором после перезагрузки магазина - я бы хотел, чтобы он сохранял положение прокрутки сетки, а не отправлял ее обратно наверх.

Поскольку это более ранняя версия ExtJS - это не работает.

viewConfig: {
   preserveScrollOnRefresh: true
}

Я думал, что нашел решение, согласно предложению Зика, использовать функцию scrollTo следующим образом:

//Save position
var top = grid.getView().scrollergetScroll().top;

//Restore position
grid.getView().scroller.scrollTo('top',top);

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

grid().getStore().reload({
    callback: function (response) {
        //Works at this point
        grid.getView().scroller.scrollTo('top',top);
    }
}

//However the cursor pops right back up to the top after popping out of 
//reload() block

Заранее спасибо

1 Ответ

0 голосов
/ 17 мая 2019

Это немного глупо - возможно, лучшая стратегия - просто не использовать более старые версии ExtJS - но, похоже, это работает нормально.

По сути, просто объявляем некоторые глобальные переменные, которые можно увидеть из любого места в файле - один из них - флаг, указывающий, что произошло событие, инициирующее перезагрузку (rowClicked), и один - для представления последней известной позиции полосы прокрутки

var rowClicked = false;
var prevScrollPosition = -1;

Когда происходит событие, которое вызовет повторную загрузку - установите для глобальной переменной rowClicked значение true

rowclick: function(grid, rowIndex, event) {
    rowClicked = true;

Затем в слушателях сетки используйте переменную rowClicked, чтобы определить, когда следует переместить полосу прокрутки.

listeners : {                 
    bodyscroll: function(sl, st) {
        if (rowClicked) {          
            getScenarioLineOrderNumbersGrid().getView().scroller.scrollTo('top',prevScrollPosition);
            rowClicked = false;
        }
        prevScrollPosition = st;                      
    }

Клудги - но это работает.

...