在论坛看到http://www.iteye.com/topic/457854
自己有点想法,于是随手写了个示例:
功能: 用户点击grid的表头菜单显示/隐藏列,重新刷新页面后保留。
代码如下:
Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = '/images/s.gif'; Ext.chart.Chart.CHART_URL = '/js/extjs/3.0/resources/charts.swf'; Ext.QuickTips.init(); testCookie(); }); function testCookie(){ Ext.state.Manager.setProvider( new Ext.state.CookieProvider({ expires: new Date(new Date().getTime()+(1000*60*60*24*365)) }) ); var grid = new Ext.grid.GridPanel({ width: 400, height: 200, autoScroll: true, trackMouseOver:false, ddGroup:'myDDGroup', sm:new Ext.grid.CellSelectionModel({}), cm: new Ext.grid.ColumnModel({ columns:[ {header: '序号', dataIndex: 'id', sortable: true }, {header: '名字', dataIndex: 'name', sortable: true}, {header: '描述', dataIndex: 'descript', sortable: true} ] }), viewConfig:{ forceFit:true }, renderTo:Ext.getBody(), store:new Ext.data.SimpleStore({ fields:['id','name','descript'], data:[ [1,'name001','this is name001'], [2,'name002','this is name002'], [3,'name003','this is name003'], [4,'name004','this is name004'] ] }), stateful:true, stateId:'cookiegrid', //要存入cookie的数据 getState: function(){ return {initColumn:this.initColumn}; }, applyState:function(state, config){ if(state){ Ext.apply(this,state); } //根据cookie取值设置hidden与否 var cm = this.getColumnModel(); for(var k in state.initColumn){ var col = cm.findColumnIndex(k); cm.setHidden(col,state.initColumn[k]) } }, listeners:{ //afterrender是3.0新增的,2.2可以监听render
'afterrender':function(grid){ //监听事件,把cm的显示情况存入cookie(可优化为延迟保存) //没用stateEvents的原因是hiddenchange不是grid的事件,而监听beforedestory的话,用户刷新的时候不会执行。 grid.getColumnModel().on('hiddenchange',function(cm,columnIndex,hidden){ if(!grid.initColumn)grid.initColumn={}; grid.initColumn[cm.getDataIndex(columnIndex)]=hidden; grid.saveState(); }); } } }) }
谢谢yiminghe兄的提醒...忘了GRID有覆盖这段实现了...见笑了..
下面还有一种我的写法,是用stateEvents的:
function testCookie(){ Ext.state.Manager.setProvider( new Ext.state.CookieProvider({ expires: new Date(new Date().getTime()+(1000*60*60*24*365)) }) ); var grid = new Ext.grid.GridPanel({ width: 400, height: 200, autoScroll: true, trackMouseOver:false, ddGroup:'myDDGroup', sm:new Ext.grid.CellSelectionModel({}), cm: new Ext.grid.ColumnModel({ columns:[ {header: '序号', dataIndex: 'id', sortable: true }, {header: '名字', dataIndex: 'name', sortable: true}, {header: '描述', dataIndex: 'descript', sortable: true} ] }), viewConfig:{ forceFit:true }, renderTo:Ext.getBody(), store:new Ext.data.SimpleStore({ fields:['id','name','descript'], data:[ [1,'name001','this is name001'], [2,'name002','this is name002'], [3,'name003','this is name003'], [4,'name004','this is name004'] ] }), stateful:true, stateId:'cookiegrid', //下面有把cm的该事件托管给grid stateEvents:['hiddenchange'], //要存入cookie的数据 getState: function(){ return {initColumn:this.getColumnModel().initColumn}; }, //恢复 applyState:function(state, config){ if(state){ Ext.apply(this,state); } //根据cookie取值设置hidden与否 var cm = this.getColumnModel(); for(var k in state.initColumn){ var col = cm.findColumnIndex(k); cm.setHidden(col,state.initColumn[k]) } }, listeners:{ 'beforerender':function(grid){ grid.on('hiddenchange',function(cm,columnIndex,hidden){ if(!cm.initColumn){ cm.initColumn = {}; } //监听事件,把cm的显示情况存入cookie cm.initColumn[cm.getDataIndex(columnIndex)]=hidden; this.saveState(); },this); //托管事件 grid.relayEvents(grid.getColumnModel(),['hiddenchange']); } } }) }
//tz