如何以编程方式强制使用dataView对slickGrid进行排序?

时间:2014-04-04 21:15:50

标签: sorting slickgrid

我有一个使用dataView来渲染学生成绩的slickGrid。我希望默认对网格进行排序,然后由id = 0和field =' Student'的列呈现网格。如何在网格渲染之前在此列上触发排序事件?

我之所以这样做是因为我有一个非常奇怪的错误,可以在这个视频中看到:

http://screencast.com/t/Oz0vlcsQPp

分拣机在第一次asc / des排序时工作正常,但随后它完全失控了。注意按照应有的方式排序。但是,如果我按学生名称排序,那么任何其他列上的分拣机都可以正常工作,无论我排序多少次都没有任何问题。如果我刷新页面,问题就会再次发生。

由于我甚至无法理解为什么会发生这种情况,我唯一的希望是最初对学生专栏进行排序并一起绕过问题。

注意:我在这里使用naturalSort.js:https://github.com/overset/javascript-natural-sort/blob/master/naturalSort.js。我不认为排序是问题,因为当我最初按学生名字排序时,它的工作正常......这个是我的大脑......

编辑:正如您在视频中看到的那样,我的网格单元格数据类似于" A(78.65%)"。我的数据结构如下所示:

"Column_3":{"displayValue":"A (100%)","sortValue":100.0},
"Column_4":{"displayValue":"B (87.53%)","sortValue":87.53},
"Column_5":{"displayValue":"?","sortValue":-1.0}

我发送了一个对象以进行排序,以便使用百分比作为排序标准。为了完成这项工作,我在网格选项中定义了dataItemColumnValueExtractor:

self.options["dataItemColumnValueExtractor"] = getItemColumnValue;
function getItemColumnValue(item, column) {
    var values = item[column.field];
    return values.displayValue !== undefined ? values.displayValue : values;
}

这允许我使用sortValue数据对网格进行排序。这是我的排序事件:

    grid.onSort.subscribe(function(e, args){
        var comparer = function(a, b) {
            var result;
            if (a[args.sortCol.field].sortValue !== undefined && a[args.sortCol.field].sortValue !== null && b[args.sortCol.field].sortValue !== undefined && b[args.sortCol.field].sortValue !== null) {
                result = naturalSort(a[args.sortCol.field].sortValue,b[args.sortCol.field].sortValue);
            }
            else {
                result = naturalSort(a[args.sortCol.field],b[args.sortCol.field]);
            }
            return result;
        };
        dataView.sort(comparer, args.sortAsc);
    });

底线是一切正常,除了上面提到的排序问题...任何帮助将不胜感激...

1 个答案:

答案 0 :(得分:1)

首先......你的第一次排序问题是可以修复的其他问题......

但是如果要对网格加载进行排序,可以触发click事件....

$(function () {
for (var i = 0; i < 50000; i++) {
var d = (data[i] = {});

d["num"] = i;
.
.
d["effortDriven"] = (i % 5 == 0);
} 

dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);

$('.slick-header-columns').children().eq(2).trigger('click');  // eq(2) for the 3rd col
}