You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让带Grouping功能的ExtJS Grid记住分组状态?

ExtJS 6.6.0 Grid分组折叠状态持久化解决方案

要实现Grouping特性的折叠状态持久化,需从Grid状态事件配置、Grouping Feature状态逻辑改造两方面入手,具体方案如下:

1. 配置Grid的状态监听事件

让Grid监听分组展开/折叠事件,确保状态变更时触发保存逻辑:

stateEvents: ['groupcollapse', 'groupexpand']

2. 改造Grouping Feature的状态处理逻辑

Grouping Feature默认不支持折叠状态持久化,需开启其stateful属性,并通过重写getState和applyState方法实现状态的保存与恢复:

features: [{
    ftype:'grouping',
    groupHeaderTpl: '{name}',
    stateId: 'textbausteingrouping-grouping-feature', // 给Feature单独设置状态ID
    stateful: true, // 开启Feature状态持久化
    // 收集当前折叠的分组信息,存入状态
    getState: function() {
        var collapsedGroups = [];
        this.view.eachNode(function(node) {
            var group = node.getGroup();
            if (group && group.collapsed) {
                collapsedGroups.push(group.getGroupName());
            }
        });
        return { collapsedGroups: collapsedGroups };
    },
    // 恢复保存的折叠状态
    applyState: function(state) {
        if (!state?.collapsedGroups) return;
        
        var me = this;
        // 确保Store加载完成后再恢复(分组依赖Store数据)
        if (!me.store.isLoaded()) {
            me.store.on('load', function() {
                me.restoreCollapsedGroups(state.collapsedGroups);
            }, me, { single: true });
        } else {
            me.restoreCollapsedGroups(state.collapsedGroups);
        }
    },
    // 辅助方法:批量折叠指定分组
    restoreCollapsedGroups: function(collapsedNames) {
        collapsedNames.forEach(function(groupName) {
            var group = this.view.getGroup(groupName);
            if (group && !group.collapsed) {
                this.collapse(groupName);
            }
        }, this);
    }
}]

3. 确保全局状态管理器配置正常

ExtJS状态持久化依赖Ext.state.Manager,默认使用CookieProvider,可在应用启动时显式配置(可选,确保状态存储生效):

Ext.state.Manager.setProvider(new Ext.state.CookieProvider({
    expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) // 状态保存30天
}));

完整代码示例

// 全局状态管理器配置(可放在app.js初始化时)
Ext.state.Manager.setProvider(new Ext.state.CookieProvider({
    expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)
}));

me.viewBox = Ext.create('Ext.grid.Panel', {
    store: me.gridGroupingStore,
    stateId: 'textbausteingrouping',
    stateful: true,
    stateEvents: ['groupcollapse', 'groupexpand'], // 监听分组状态变更事件
    columns: [
        { text: 'Name', dataIndex: 'title', flex: 1 },
        { text: 'Gruppe', dataIndex: 'group', flex: 1, hidden:true }
    ],
    features: [{
        ftype:'grouping',
        groupHeaderTpl: '{name}',
        stateId: 'textbausteingrouping-grouping-feature',
        stateful: true,
        getState: function() {
            var collapsedGroups = [];
            this.view.eachNode(function(node) {
                var group = node.getGroup();
                if (group && group.collapsed) {
                    collapsedGroups.push(group.getGroupName());
                }
            });
            return { collapsedGroups: collapsedGroups };
        },
        applyState: function(state) {
            if (!state?.collapsedGroups) return;
            
            var me = this;
            if (!me.store.isLoaded()) {
                me.store.on('load', function() {
                    me.restoreCollapsedGroups(state.collapsedGroups);
                }, me, { single: true });
            } else {
                me.restoreCollapsedGroups(state.collapsedGroups);
            }
        },
        restoreCollapsedGroups: function(collapsedNames) {
            collapsedNames.forEach(function(groupName) {
                var group = this.view.getGroup(groupName);
                if (group && !group.collapsed) {
                    this.collapse(groupName);
                }
            }, this);
        }
    }]
});

配置完成后,用户折叠的分组状态会被保存到Cookie(或自定义状态存储)中,下次打开页面时将自动恢复之前的折叠状态。

内容的提问来源于stack exchange,提问作者Orgoth Dorngree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:15:35