2014-09-19 85 views
2

我試圖創建一個插件,它將改變列的排序行爲。該列中的數據是一個<ul>元素。在列表的每個<li>元素中,都有一些文本和一個十進制數。我想根據單元格列表中最大的十進制數對錶格進行排序。這裏顯示了插件中的jsfiddle,正如你所看到的,當你要按第二列,它不能正常工作:Jquery DataTables自定義排序插件不工作

http://jsfiddle.net/flyingL123/1whzq1w2/3/

如果它的工作,從大到小的順序應該是山姆(97.50)喬(80.50),邁克(17.50)和上升當然是相反的。基於我的調試,該插件爲每個單元返回正確的數值。你有什麼想法爲什麼表不會相應地排序?

這裏是從插件代碼:

$.fn.dataTable.ext.order['number-list'] = function (settings, col) 
{ 
    return this.api().column(col, {order:'index'}).nodes().map(function (td, i) { 

        //get all numbers from the cell into an array and parseFloat each one 
        var nums = $(td).html().match(/(\d+.\d+)/); 

        if(nums){ 
          nums = nums.map(function(val){return parseFloat(val, 10);}); 
          return Math.max.apply(null, nums); 
        } 
        else{ 
          return 0; 
        } 
      }); 
} 

回答

2

注:這個答案是完全重寫。

關於數據表自定義排序和自定義數據源
原來的答案是什麼數據表稱之爲基於排序類型。 dataTables誕生了對基本「基元」或類型的排序功能:string,numeric,datehtml。默認情況下,dataTables嘗試猜測某列所包含的數據類型,然後用戶單擊表頭,該表將根據檢測到的類型進行排序。您可以使用sType/type選項(如sType : 'string')(如果需要某種方式,或者數據表未檢測到類型正確)強制某個類型到特定列。例如,您希望將列排序爲數字,但數據表按字母順序排序,則可以設置sType : 'numeric'

很明顯,內置的排序功能並不總是能滿足所有的需求,就像你的例子。在這種情況下,您可以創建一個新的type,如您在原始答案中看到的或在其他自定義排序插件中看到的那樣。例如。在方案type-pre,type-desc,type-asc之後向oSort添加對象。這些函數定義不是強制性的,而是那些dataTables會迴應的。例如,type-pre - 預處理函數 - 不是必需的,但如果在調用實際排序函數之前內容需要特殊處理,則非常有用。

dom-text(及其類似)基本上是獨立的type-pre。如果您只是希望排序算法對列內容的某個部分進行排序,但不需要全新的排序算法,則此功能非常有用。 dataTables將其定義爲custom data source sorting。例如,如果您有一個包含名稱的列,如firstname lastname,但要對lastname進行排序,那麼這就是要走的路。

非常好的一點是,你可以結合上述所有。默認排序,默認類型檢測,強制類型,自定義排序插件和自定義數據源。

在這裏,我們有尷尬部分:(我有自己很多,我需要特殊的排序算法的情況下,所以我一直所以用來排序插件踩住定製在一起,那我乾脆忽略了你是什麼試圖做:(我真的不記得確切的情況,但顯然我已經看到你的問題,而在上午9時喝咖啡,然後回答自定義排序插件,如自動駕駛儀。 - 你的問題是完全正確的,你的問題中的代碼也是對的,考慮我上面寫的:你需要的是custom data source和內建排序類型numeric的組合,真正的答案是你如此完美se,你只是忘了設置type,這是非常必要的,因爲默認排序類型是string。所以

var myDataTable = $('#myTable').DataTable({ 
    "columns":[ 
     null, 
     {"orderDataType":"number-list", type: 'numeric'} // <--- just set the type to numeric 
    ], 
    "order":[], 
}); 

這就是它!這是你原來的小提琴 - >http://jsfiddle.net/rd0p6ts8/

對不起,我很困惑。無論如何,希望你會接受答案。

+1

這是有效的,但我不清楚它爲什麼起作用。我也使用這裏找到的'dom-text'插件:https://datatables.net/plug-ins/sorting/custom-data-source/dom-text。爲什麼這個定義不同?我的印象是,我試圖實現的自定義排序與這個「dom-text」插件所做的相同。那麼爲什麼它的定義不同呢? – flyingL123 2014-09-30 19:09:31

+0

@ flyingL123 - 完全重寫了答案。瞭解你爲什麼想知道。儘管我的答案在功能方面起了作用,但它並不是真正的答案,因爲真正的答案非常簡單,不需要創建新的排序algortihm。一個好的答案必須以自己的方式解決問題,而不是重新發明輪子。顯然,我沒有想到當我做了第一個答案:( – davidkonrad 2014-09-30 22:39:03

相關問題