重新加载网格存储时如何停止滚动到顶部 - 采取 2

How do you stop scrolling to top when grid store is reloaded - take 2

我有一个使用 ExtJS 3.3.0 的应用程序。它使用一个 EditorGridPanel,在商店重新加载后 - 我希望它保留网格的滚动位置而不是将其发送回顶部。

因为它是 ExtJS 的早期版本 - 这不起作用。

viewConfig: {
   preserveScrollOnRefresh: true
}

我想我已经根据 Zeke 的建议找到了一个解决方案,可以像这样使用 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

提前致谢

这有点笨拙 - 也许最好的策略就是不使用旧版本的 ExtJS - 但这似乎工作正常。

基本上只是声明一些可以从文件中的任何地方看到的全局变量——一个是标志,表示触发重新加载的事件已经发生(rowClicked),一个表示最后已知的位置滚动条

var rowClicked = false;
var prevScrollPosition = -1;

当事件发生时将触发 re-load - 将全局变量 rowClicked 设置为 true

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

然后在网格的侦听器中使用 rowClicked 变量来确定何时 re-position 滚动条。

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

Kludgy - 但它有效。