(ExtJS 3.3.1)
在调用grid.store.reload()后,如何保存网格的滚动位置?
答案 0 :(得分:4)
这是两个不同的问题。
首先,要重新加载商店而不重新绘制网格,请使用store.suspendEvents()
,然后在加载回调中调用store.resumeEvents()
。
刷新后恢复滚动位置有点棘手,特别是因为ExtJS在Firefox中过度使用了setTimeout
和defer
。尝试使用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);