问题:
在grid里实现跨页选中,也就是当在第一页选中的checkbox,在Load到第二页时返回第一页时,已经选中的不能被显示为选中
解决思路:
1. 首选考虑,使用数组或者map等保存我们选中的记录
在CheckboxModel中,select用来选中,deselect用来反选(取消选中),
select时,把记录保存进我们的数组中
deselect时,把数组中曾放进去的该记录删除
2. 之后,在每次翻页的时候,要把曾选中的记录在该页标示为选中状态
store中 ,load方法中处理,比较数组中和store中的数据,相同的记录设为选中状态
3. 前2步之后,可以了,但是发现还是会在翻页中删除;
原因,在load的时候,EXT4还是自动调用了deselect方法,这样就无形中删除了保存在数组中的记录
因此,我们在load之前要处理: before中,我们禁用deselect方法,load之后在放入deselect方法
解决代码:
stroe中添加事件:
listeners : { beforeload : function(store, operation, eOpts) { Ext.apply(store.proxy.extraParams, me.getQueryParameters()); selMod.removeListener('deselect'); }, load : function(store,records,succ,eOpts) { selMod.removeListener('deselect'); var selections = new Array(); store.each(function(record){ if(recordIds.length>0){ for(i=0;i<recordIds.length;i++){ var id=recordIds[i]; if(record.data.tableId==id){ selections.push(record); break; } } } }); selMod.select(selections,true); selMod.addListener('deselect',deSelection); } }
//反选:删除选中 var deSelection=function(sm,rec){ recordIds.pop(rec.data.tableId); alert("删除当前选中的记录"); };
var selMod=Ext.create('Ext.selection.CheckboxModel', { checkOnly : true, listeners:{ select:function(sm,selection,num,opts){ recordIds.push(selection.data.tableId); alert("选中当前记录"); }, deselect:deSelection } });