我刚开始为我正在进行的项目测试Slickgrid,它的性能给我留下了深刻的印象。我的一项要求是对多列进行排序。我没有完全把我的头包裹在 Slickgrid 中的 Dataview 上,所以也许我遗漏了一些明显的东西,但是有没有办法在多列上对网格进行排序?即使 UI 不能处理多个排序,我希望能够按顺序调用一个函数,加上升序或降序。我可以用Datatables做到这一点,但它没有分组(项目的另一个要求)。
在最坏的情况下,我将求助于在服务器上进行排序并将内容提供给静态排序的客户端。
我刚开始为我正在进行的项目测试Slickgrid,它的性能给我留下了深刻的印象。我的一项要求是对多列进行排序。我没有完全把我的头包裹在 Slickgrid 中的 Dataview 上,所以也许我遗漏了一些明显的东西,但是有没有办法在多列上对网格进行排序?即使 UI 不能处理多个排序,我希望能够按顺序调用一个函数,加上升序或降序。我可以用Datatables做到这一点,但它没有分组(项目的另一个要求)。
在最坏的情况下,我将求助于在服务器上进行排序并将内容提供给静态排序的客户端。
我让它在 dataView 中使用多列排序。也是最容易理解的。这是来自 github 中的示例,除了我必须为 dataView.sort() 再传递一个参数。它总是正确的,你可以在你的函数中处理排序方向。
grid.onSort.subscribe(function (e, args) {
gridSorter(args.sortCols, dataView);
});
function gridSorter(sortCols, dataview) {
dataview.sort(function (row1, row2) {
for (var i = 0, l = sortCols.length; i < l; i++) {
var field = sortCols[i].sortCol.field;
var sign = sortCols[i].sortAsc ? 1 : -1;
var x = row1[field], y = row2[field];
var result = (x < y ? -1 : (x > y ? 1 : 0)) * sign;
if (result != 0) {
return result;
}
}
return 0;
}, true);
}
以防万一它帮助某人。
您可以链接排序比较器以进行多列排序。而不是做
function comparerOnCol1(a, b) {
return a["col1"] - b["col1"];
}
function comparerOnCol2(a, b) {
return a["col2"] - b["col2"];
}
你可以做
// sort by col1, then col2
function combinedComparer(a, b) {
return comparerOnCol1(a, b) || comparerOnCol2(a, b); // etc.
}
或者只是内联实现它。
至于在 UI 中反映排序顺序,虽然您不能直接执行,但您可以通过在要排序的列定义上设置“headerCssClass”并让它们显示箭头来应用排序指示符(否则您'表示排序列)。
这里有一个使用“multiColumnSort”选项的示例。
http://mleibman.github.com/SlickGrid/examples/example-multi-column-sort.html
我认为它不起作用,因为 args.sortCols 始终是 1 的数组。
[编辑]为了让它工作,我需要在点击列标题之前按住 shift (不是很直观恕我直言)另见:https ://github.com/mleibman/SlickGrid/pull/276
我花了一段时间试图用 dataview 解决这个问题(没有 shift 键恶作剧),我想我找到了解决方法。
使用单列排序{multiColumnSort: false}
并将排序参数存储在闭包中。如果字段相等,则推迟到前一个比较器。
var currentSortCmp = null;
grid.onSort.subscribe(function (e, args) {
// declarations for closure
var field = args.sortCol.field;
var sign = args.sortAsc ? 1 : -1;
var prevSortCmp = currentSortCmp;
// store closure in global
currentSortCmp = function (dataRow1, dataRow2) {
var value1 = dataRow1[field], value2 = dataRow2[field];
//if equal then sort in previous closure (recurs)
if (value1 == value2 && prevSortCmp)
return prevSortCmp(dataRow1, dataRow2);
return (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign;
};
dataView.sort(currentSortCmp);
grid.invalidate();
grid.render();
});
记住所有以前的命令。只是工作。按预期工作。