在extjs网格4.2.1中,是否有一种方法可以根据相同的列值计算行数并计算两行的总和(列数据)

时间:2017-05-23 05:18:50

标签: extjs

例如,有一个extjs网格显示以下字段: 学生身份,主题和标记

现在,不同主题的同一学生ID将有不同的标记,我们必须按标记排序,以便计算特定学生ID的标记总数,并按总分数排序。

关于如何在ext js中实现它的任何建议? Sample Example Image

1 个答案:

答案 0 :(得分:0)

对于版本 4.2 ,可以在网格列marks上定义sorterFn。排序时将调用sorterFn进行比较。此函数将计算被比较的两个学生的总分数,并返回-1,0或1以表示哪个更大。

doSort: function (state) {
            var store = this.up('grid').getStore();
            var field = this.getSortParam();
            var records = [];
            store.each(function (r) {
                records.push(r.copy());
            });
            store.sort({
                property: field,
                direction: state,
                sorterFn: function (record1, record2) {
                    var total1 = 0,
                        total2 = 0;
                    records.forEach(function (rec) {
                        if (rec.data.studentID === record1.data.studentID)
                        total1 += rec.data.marks
                    });
                    records.forEach(function (rec) {
                        if (rec.data.studentID === record2.data.studentID)
                        total2 += rec.data.marks
                    });

                    return total1 > total2 ? 1 : (total1 < total2 ? -1 : 0)
                }
            });

        }

See fiddle here了解网格的示例实现。单击Marks列标题进行排序。

如果您使用ExtJS 6 ,则可以在商店的标记列中添加带有sorterFn的分拣机:

store.sorters.items[0].setSorterFn(function (record1, record2) {
    var total1 = 0,
        total2 = 0;
    records.forEach(function (rec) {
        if (rec.data.studentID === record1.data.studentID)
            total1 += rec.data.marks
    });
    records.forEach(function (rec) {
        if (rec.data.studentID === record2.data.studentID)
            total2 += rec.data.marks
    });

    return total1 > total2 ? 1 : (total1 < total2 ? -1 : 0)
});

有关创建分拣机功能的详细信息,请参阅Sencha docs

有关网格的示例实现,请参阅fiddle here。单击Marks列标题进行排序。