2014-10-29 39 views
2

我有一個kendo網格,並希望某些行在排序後保持固定在網格頂部。我可以通過在每列上指定一個自定義排序來實現這一點。例如:自定義在Kendo網格上排序,可編程觸發

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 
    ] 
}); 

當網格按用戶單擊列標題進行排序時,此工作正常。但是,如果我想使用Javascript代碼,像這樣排序的網格:

$('#grid').data('kendoGrid').dataSource.sort({field: 'age', dir: 'asc'); 

pinToTop字段被忽略。這是因爲排序在DataSource上執行,但自定義排序邏輯是網格的一部分。

JSFiddle Example

我需要:

  • 能夠在數據源指定自定義排序邏輯,所以,當我整理使用JavaScript,固定行留在上面的數據源。

或者:

  • 能夠執行一種網格本身,而不是數據源,從JavaScript。
+0

可以執行自定義排序在服務器端? – CSharper 2014-10-29 17:46:41

回答

2

這是不太我想要的東西,但我可以通過排序多個字段和第一包括pinToTop領域來解決這個問題:

$('#grid').data('kendoGrid').dataSource.sort([{field: 'pinToTop', dir: 'desc'},{field: 'age', dir: 'asc'}]); 
1

這是一個老問題,但在這裏對於那些遇到這個問題的人來說,就像我一樣。

定義比較的功能,並把它傳遞給數據源:

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