ExtJS 3 多个状态网格(但具有不同的 stateIds)

Posted

技术标签:

【中文标题】ExtJS 3 多个状态网格(但具有不同的 stateIds)【英文标题】:ExtJS 3 multiple stateful grids (but with different stateIds) 【发布时间】:2013-02-07 11:36:23 【问题描述】:

我有我的网格,它会覆盖 Ext.grid.GridPanel

我在我网站的 2 个地方使用了这个网格。我为他们生成了 2 个不同的 stateId:

构造函数:

TasksGrid.superclass.constructor.call(this, 
    id: genId,
    cls: 'tasks-grid',
    border: false,
    loadMask: msg: 'Loading...',
    sm: sm,
    stateful: true,
    stateId: 'tasks-grid'+(config.booClientTab ? '-clients-tab' : ''), // depending on config.booClientTab I setup one or other stateId
...

我在现场 2 个地方调用此代码来创建 2 个网格:

this.TasksGrid = new TasksGrid(this, 
    region: 'west',
    split: true,
    width: tasksGridWidth ? tasksGridWidth : defaultWidth,
    booShowToolbar: true,
    booClientTab: !empty(config.clientId) // if true, 1 stateId will be setup, false - other
);

但是,当我测试时,状态仅应用于 2 个生成的网格中的第一个!!我检查了 cookie:似乎一切正常:创建了 2 个具有 2 个不同名称的 cookie。但是...状态仅适用于“this.TasksGrid = new TasksGrid”的第一次调用!!!

ExtJS 版本:3.0

有什么想法吗?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。状态只能在初始化期间而不是在初始化之后应用于组件。因此它第一次起作用,但之后不起作用。幸运的是,您使用的是 EextJs 3,以下代码在 ExtJS 3 中为我工作,但在 4 中没有。基本上,当您将新/其他状态应用于网格时,只需调用

MyGrid = Ext.extend(Ext.grid.GridPanel,

    /* @private */
    constructor: function(config)
    
        MyGrid.superclass.constructor.call(this, config);
    ,
    initComponent: function()
    
        var cfg =
        
            border: true,
            bodyBorder: false,
            stateful: true,
            stateId: 'grid',
            tbar:
                [
                    text: 'View name'
                ,
                    xtype: 'combo',
                    width: 80,
                    typeAhead: true,
                    triggerAction: 'all',
                    mode: 'local',
                    forceSelection: true,
                    hiddenName: 'stateId',
                    selectOnFocus:true,
                    displayField:'name',
                    ref: '../stateCombo',
                    valueField: 'id',
                    listeners:
                    
                        scope: this,
                        change: function(combo, newValue, oldValue)
                        
                            newValue = parseInt(newValue, 10); var grd = this;
                            grd.el.mask('Applying the view please wait');
                            var data = combo.store.data.items;
                            Ext.each(data, function(d)
                            
                                d.data.id = parseInt(d.data.id, 10);
                                if(d.data.id === newValue)
                                
                                    Ext.util.Cookies.set('reportStateName', d.data.machineName);
                                    grd.applyState(MyStateProvider.decodeState(d.data.value));
                                    var conf = grd.getColumnModel().config;
                                    grd.getColumnModel().setConfig(conf);
                                    grd.doLayout();
                                    grd.getView().updateAllColumnWidths();
                                    grd.getView().refresh(true);
                                    return;
                                
                            );
                            grd.el.unmask();
                            grd = null;
                        
                    ,
                    store: new Ext.data.JsonStore
                        (
                            fields:
                                [
                                    name: 'id',
                                    type: 'int'
                                ],
                            proxy : new Ext.data.HttpProxy
                                (
                                    method: 'GET',
                                    url: BASEURL + 'getsavedstate'
                                ),
                            idProperty: 'id'
                        )
                ]
        ;
        //we use applyIf for configuration attributes that should be left configurable
        Ext.applyIf(this, cfg);
        //ensure that any extra configurations that are set in initComponent method are applied to initialConfig:
        Ext.applyIf(this.initialConfig, cfg);
        /*
         * Properties specified here are safe/protected from being overridden
         * by an instance, so any 'private' default properties might be specified here.
         */
        //some attributes we may want to keep unaltered, so we use Ext.apply non-alterable configurables
        cfg =
        
            sm: new Ext.grid.RowSelectionModel(singleSelect:true),
            stripeRows: true,
            loadMask: true
        ;
        Ext.apply(this, cfg);
        //need this to work sometimes:
        Ext.apply(this.initialConfig, cfg);
        MyGrid.superclass.initComponent.apply(this, arguments);
        this.on
            (
                afterrender: function(grid)
                
                    var grd = this;
                    this.stateCombo.getStore().load
                        (
                            callback: function(data, options, success)
                            
                                grd.saveAsStateBtn.enable();
                                var applied = false;
                                var setStateValue = Ext.util.Cookies.get('reportStateName');
                                Ext.each(data, function(d)
                                
                                    //meaning no cookie was set so first time.
                                    if(setStateValue === null)
                                    
                                        if(d.data.machineName === 'default')
                                        
                                            if(d.data.value !== '')
                                            
                                                grd.applyState(MyStateProvider.decodeState(d.data.value));
                                                applied = true;
                                                grd.stateCombo.setValue(d.data.id);
                                                return;
                                            
                                            applied = true;
                                            grd.stateCombo.setValue(d.data.id);//Here value should be fetched from cookie
                                            return;
                                        
                                    
                                    else//Cookie was set
                                    
                                        if(d.data.machineName === setStateValue)
                                        
                                            if(d.data.value !== '')
                                            
                                                var s = MyStateProvider.decodeState(d.data.value);
                                                grd.applyState(s);
                                                applied = true;
                                                grd.stateCombo.setValue(d.data.id);//Here value should be fetched from cookie
                                                return;
                                            
                                            else
                                            
                                                return;
                                            
                                        
                                    
                                );
                                //grd.doLayout();
                                if(data.length !== 0)
                                
                                    grd.stateCombo.enable();
                                    grd.saveStateBtn.enable();
                                
                                var conf = grd.getColumnModel().config;
                                grd.getColumnModel().setConfig(conf);
                                grd.doLayout();
                                grd.getView().updateAllColumnWidths();
                                grd.getView().refresh(true);
                                grd.doLayout();
                                grd.el.unmask();
                            
                        );
                    this.el.mask('Applying the saved view please wait');
                ,
                scope: this
            );
    ,
    onRender: function (container, position)
    
        MyGrid.superclass.onRender.apply(this, arguments);
        var el = this.el;
        var grd = this;
        this.saveStateWindow = new MySaveStateWindow
            (
                grid: grd,
                renderTo: el
            );
    ,
    // template method
    /* @private */
    initEvents: function()
    
        MyGrid.superclass.initEvents.apply(this, arguments);
    ,
    afterRender: function()
    
        MyGrid.superclass.afterRender.apply(this, arguments);
    ,
    // template method
    /* @private */
    beforeDestroy: function()
    
        //Call parent
        MyGrid.superclass.beforeDestroy.apply(this, arguments);
    ,
    onDestroy: function()
    
        this.saveStateWindow.destroy();
        MyGrid.superclass.onDestroy.apply(this, arguments);
    
);

【讨论】:

对不起,但似乎没有帮助......或者我没有正确使用您的代码。我在“this.TasksGrid = new TasksGrid”块之后复制/粘贴了您的代码,用我的 var this.TasksGrid 替换了您的 var 网格 您必须在应用状态后应用代码,例如 grid.applyState(state);在网格本身的初始化过程中,不需要上面的代码。 我也有同样的问题,你能(nicholasnet)向我们展示完整的工作示例吗? 例如感谢@nicholasnet。但是我不清楚 - 您将网格设置为有状态并且以后没有使用该状态 ID。您仅从您保存在组合框项目中的信息(以及之前从服务器加载)中加载和设置信息。据我了解-fcunited 需要在第二次渲染网格时加载列的状态。那么我们如何获取当前状态并在需要时加载呢?

以上是关于ExtJS 3 多个状态网格(但具有不同的 stateIds)的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 网格面板 - 每行多个“行”?

ExtJS:使用一个网格加载多个商店

根据状态检查 extjs 网格中的行

具有布局适合和网格的 Extjs 3.3.1 FieldSet 在窗口调整大小时不会调整网格大小

将 c# 数据表放入 extjs 网格

extjs网格面板单元格中的多行文本