日期:2014-05-16  浏览次数:20722 次

extjs jsonstore筛选重复数据问题,大家入来指点下。 - Web 开发 / Ajax
本人写的一个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);