本人写的一个store如下:
- Java code
this.store = new Ext.data.JsonStore({ url : "/work/listWork.do", root : "result", totalProperty : "totalCounts", remoteSort : true, idProperty : "userId",//通过两张表相同字段筛选唯一记录 fields : [{ name : "workId",//work表主键字段 type : "int" }, "user"]//user表 });
如上面所写,在数据显示区域会有空白记录占据,因为加了idProperty属性去了重复的记录。如何能不让已经筛选掉的记录不占据页面空间呢?
user表记录人员信息,work表记录职位工作信息,一个userId在work表可能有多条记录,我的目的是界面只显示其中一条记录,再通过界面显示的这条记录点击进入看这个userId的所有相关work信息。work表信息如下:
workId userId content1 content2
1 1 a1 a2
2 1 b1 b2
3 2 c1 c2
4 3 d1 d2
不加idProperty属性界面显示:(假如一页显示2条记录)
content1 content2
a1 a2
b1 b2
c1 c2 (这里是第二页了)
d1 d2
加了idProperty属性界面显示:
content1 content2
a1 a2
(在页面后面这里会有空行占位)
c1 c2 (这里是第二页了)
d1 d2
我的目的是实现下面这种效果:
content1 content2
a1 a2
c1 c2
d1 d2 (这里是第二页了)
大家碰到过这种问题的都来说说,说说你们是怎么处理的???或者给个思路。
------解决方案--------------------
先用GroupingStore进行该字段的分组,然后写个聚合函数就可以了,然后点击的话在重新加载数据,如果是grid显示的话可以直接用pivotgrid,稍微修改一下可以用,用groupingstore时注意要显式指定reader:new Ext.data.JsonReader({});
必须指定sortInfo;版本是3.3.0.
- JScript code
app.ux.AggregateStore=Ext.extend(Ext.data.GroupingStore,{ summaryField:null, constructor:function(config){ Ext.apply(this,config); app.ux.AggregateStore.superclass.constructor.call(this); this.on('load',this.aggregate,this); }, aggregate:function(){ var rec=null; this.each(function(record){ if(rec==null||rec.data[this.groupField]!=record.data[this.groupField]){ /////针对特定项目的处理 if(record.data.salePrice==undefined||record.data.salePrice==0){ record.data.salePrice=record.data.price; } record.data.profit=(record.data.salePrice-record.data.price)*record.data.quantity; //////////通用代码 rec=record; return; } if(rec.data[this.groupField]==record.data[this.groupField]){ /////针对特定项目的处理 var currentTotal=record.data.total; record.data.profit=(record.data.salePrice-record.data.price)*record.data.quantity; record.data.profit+=rec.data.profit; record.data[this.summaryField]+=rec.data[this.summaryField]; record.data.quantity+=rec.data.quantity; /////////////通用代码 this.remove(rec); rec=record; } },this);