也谈谈Ext.Grid之记录用户使用习惯—隐藏列

在论坛看到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值