如何持久化 ExtJS 数据网格列隐藏/显示/移动/调整大小?

Posted

技术标签:

【中文标题】如何持久化 ExtJS 数据网格列隐藏/显示/移动/调整大小?【英文标题】:How can I persist ExtJS datagrid column hiding/showing/moving/resizing? 【发布时间】:2011-07-30 07:02:31 【问题描述】:

我想让用户对 ExtJS 数据网格的列显示(隐藏、显示、移动、调整大小)的更改持久化并存储在服务器上。有很多事件要监听,但在网格本身上注册处理程序似乎不会导致警报被调用:

    grid.on('hide', function(event)
        
        alert('Save column order: column hidden.');
        );
    grid.on('move', function(event)
        
        alert('Save column order: column moved.');
        );
    grid.on('resize', function(event)
        
        alert('Save column sizes: column resized.');
        );
    grid.on('show', function(event)
        
        alert('Save colum order: column shown.');
        );

(我的基本方法可能是最优的,也可能不是最优的。)

我具体应该怎么做才能监听这些事件?我可以在不触发警报的情况下隐藏、显示、移动和调整列大小。

【问题讨论】:

这适用于 GridPanel,但 EditorGridPanel 有问题。对于有状态的 EditorGridPanel 有什么建议吗? 别在意最后一个问题;我需要设置 stateId,然后一切都很开心。 【参考方案1】:

首先,你需要配置一个state provider。CookieProvider是ExtJS唯一内置的

Ext.state.Manager.setProvider(new Ext.state.CookieProvider());

第二,将yourGridPanel.stateful标记为true

第三,看看是否需要更改GridPanel的默认值。stateEvents 这基本上是“一个事件数组,当被触发时,应该触发这个组件来保存它的状态

第四, HttpStateProvider 没有内置在 ExtJS 中,但Saki 有一个ux (user extension) for it。

第五,如果你想保存多个组件的状态,它们应该明确设置idstateId

一个好的方法是使用内置的CookieProvider 使其按预期工作,然后切换到Http Provider。

【讨论】:

这是一个 2.x 扩展,当我尝试从 3.x 运行它时,我得到“未定义不是函数”试图实例化 Ext.ux.HttpProvider()。关于获得 3.0 端口的任何建议? 是否可以存储所有网格行的状态? @Shekhar - 网格状态与网格配置有关。不是您在行中看到的商店数据。您将需要在后端处理行的保存,并使用参数从存储中向服务器调用检索它们。【参考方案2】:

网格应该有一个名为“有状态”的属性。将此设置为 True 并且网格应该记住列宽等。

【讨论】:

【参考方案3】:

使用stateful: true 配置网格并设置其stateId(如果您的网格具有不会更改的ID,则可选)。同时初始化 Ext.state.Manager:

var thirtyDays = new Date(new Date().getTime()+(1000*60*60*24*30));
Ext.state.Manager.setProvider(new Ext.state.CookieProvider(expires: thirtyDays));

虽然不包含在 Ext 3 中,但您可以在网上找到使用 html5 的 localStorage 而不是 cookie 的状态提供程序。

【讨论】:

以上是关于如何持久化 ExtJS 数据网格列隐藏/显示/移动/调整大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 extjs 3.4 网格面板中显示/隐藏列

extjs 4 如何更改网格上显示的列下拉列表的顺序

ExtJs - 列隐藏/显示状态保存

如何从ExtJs网格中删除列?

Extjs 4 为啥不允许隐藏所有可隐藏的列?

如何在 extjs 网格(单元格编辑)中将完整列显示为可编辑?