我有一个kendo网格,并希望某些行在排序后保持固定在网格的顶部。我可以通过在每列上指定自定义排序来实现此目的。例如:
<script>
var ds = new kendo.data.DataSource({
data: [
{ name: "Jane Doe", age: 30, height: 170, pinToTop: false },
{ name: "John Doe", age: 33, height: 180, pinToTop: false },
{ name: "Sam Doe", age: 28, height: 185, pinToTop: true },
{ name: "Alex Doe", age: 24, height: 170, pinToTop: false },
{ name: "Amanda Doe", age: 25, height: 165, pinToTop: true }
]
});
$('#grid').kendoGrid({
dataSource: ds,
sortable: {mode: 'single', allowUnsort: false},
columns: [{
field: "name",
title: "Name",
sortable: {
compare: function (a, b, desc) {
if (a.pinToTop && !b.pinToTop) return (desc ? 1 : -1);
if (b.pinToTop && !a.pinToTop) return (desc ? -1 : 1);
if (a.name > b.name) return 1;
else return -1;
}
}
}
//Other columns would go here
]
});
</script>
当用户单击列标题对网格进行排序时,此方法可以正常工作。但是,如果我想使用Javascript代码对网格进行排序,请执行以下操作:
$('#grid').data('kendoGrid').dataSource.sort({field: 'age', dir: 'asc'});
忽略pinToTop
字段。这是因为排序是在DataSource上执行的,但自定义排序逻辑是网格的一部分。
我需要:
或者:
答案 0 :(得分:2)
这不是我想要的,但我能够通过对多个字段进行排序并首先包含pinToTop
字段来解决此问题:
$('#grid').data('kendoGrid').dataSource.sort([{field: 'pinToTop', dir: 'desc'},{field: 'age', dir: 'asc'}]);
答案 1 :(得分:1)
这是一个老问题,但对于遇到这个问题的人来说,这是一个答案,就像我一样。
将比较定义为函数并将其传递给DataSource:
var compareName = function (a, b, desc) {
if (a.pinToTop && !b.pinToTop) return (desc ? 1 : -1);
if (b.pinToTop && !a.pinToTop) return (desc ? -1 : 1);
if (a.name > b.name) return 1;
else return -1;
}
$('#grid').data('kendoGrid').dataSource.sort({field: 'age', dir: 'asc', compare: compareName);
适用于2017.2.621版本