ExtJS:重新加载数据存储区而不重绘网格

时间:2011-02-22 16:00:30

标签: extjs scroll grid reload store

(ExtJS 3.3.1)

在调用grid.store.reload()后,如何保存网格的滚动位置?

5 个答案:

答案 0 :(得分:4)

这是两个不同的问题。

首先,要重新加载商店而不重新绘制网格,请使用store.suspendEvents(),然后在加载回调中调用store.resumeEvents()

刷新后恢复滚动位置有点棘手,特别是因为ExtJS在Firefox中过度使用了setTimeoutdefer。尝试使用var state = view.getScrollState()保存滚动状态,然后使用view.restoreScroll.defer(1, state)

将其恢复

答案 1 :(得分:4)

最后我在extjs grid faq中找到了this section。剪切不会直接在webkit浏览器中运行。您必须添加超时并稍后调用还原部分。 100ms让我在这里帮助我。这就是我现在所拥有的:

grid.getView().on('beforerefresh', function(view) {
  view.scrollTop = view.scroller.dom.scrollTop;
  view.scrollHeight = view.scroller.dom.scrollHeight;
});

grid.getView().on('refresh', function(view) {
    setTimeout(function () {
        view.scroller.dom.scrollTop = view.scrollTop + (view.scrollTop == 0 ? 0 : view.scroller.dom.scrollHeight - view.scrollHeight);
    }, 100);
});

在IE8,Chrome9,Firefox3.6中运行

Opera 11中没有

此解决方案有一个缺点:如果没有激活地告诉视图不恢复滚动位置,如果您通过分页器转到下一页,它也会被恢复。

我认为sencha应该将此功能集成为一个选项,因为如果存储重新加载数据源的相同位置,那么它是一个深度集成,用于告诉网格视图恢复位置,如果更改为baseparams是......左右。

答案 2 :(得分:4)

我设法解决了这个问题:

this.store = new Ext.data.Store({
    listeners:{
        'load':function (store, records, options) {
            var restoreScroll = function(scrollState){
                grid.getView().restoreScroll(scrollState);
            };
            if (grid.view && grid.view.scroller){
                _.delay(restoreScroll, 10,grid.getView().getScrollState());
            }
        }
    }, ...
}

如您所见,我使用_.delay(of underscore.js框架)。它就像一个setTimeout。

更优化的版本,不使用函数'restoreScroll'无法解决问题。我认为调用restoreScroll时视图会被更改。我不得不花费10毫秒。 1还不够。正如其他人所说,ext.js使用了很多延迟调用。

答案 3 :(得分:0)

func CGRectMakeWrapper(str: String) -> CGRect {

    var rect = CGRectZero

    if(str.characters.count > 0)
    {
        var arr = str.componentsSeparatedByString(",")

        if(arr.count == 4)
        {
            rect = CGRect(x: CGFloat((arr[0] as NSString).doubleValue), y: CGFloat((arr[1] as NSString).doubleValue), width: CGFloat((arr[2] as NSString).doubleValue), height: CGFloat((arr[3] as NSString).doubleValue))
        }

    }



    return rect
}

var rect = "10.0,10.0,100,100" //String


var rect1 = CGRectMakeWrapper(rect)  //CGRect

为我工作(添加视图配置)

答案 4 :(得分:0)

这篇文章最近帮助我发现视图保持对scrollState的控制。 我能够 view.saveScrollState()然后使用 timeOut 推迟 view.restoreScrollState()。超时越长,返回的震动就越大,因此请注意,您希望视图刷新/渲染的最小timeOut量。早期帖子中缺少的是该视图有一个" saveScrollState"它在内部存储滚动位置。

view.saveScrollState();
//do some things here
setTimeout(function(){
   view.restoreScrollState();
},1);