我們在使用easyui對列進行自動排序的時候(即順序倒序),正常情況下是通過設置field中的sortable:true屬性來控制是否可以排序。但是我們會發現一個有趣的問題,在對數字進行排序的時候,這個排序功能不怎么好用,當我們對一列金額進行從小到大進行排序,例如1000,200,30,9000。排在最前面的竟然是1000,然后是200,30,9000。這就無法達到我們的要求。
為什么會出現這種情況,想想應該能發現肯定是easyui排序功能不是按照我們想要的方式進行排序。這個時候我們就可以去閱讀easyui的源碼,不要害怕這一大堆的源碼,硬着頭皮去讀,當然也有一些技巧,例如先搜索datagird這種組件名,然后搜索對應的屬性名sortable,然后就去找其中的實現方式。這個當然還是需要一定的耐心和一定的閱讀代碼的功底。
就不說我是如何找到datagrid實現排序的代碼,直接上代碼:
1 if(opt){ 2 var _4a3=opt.sorter||function(a,b){ 3 return (a>b?1:-1); 4 };
這段代碼中_4a3=opt.sorter||function(){a,b}的意思是指定col的排序方式,可以在options中定義對應的排序方式,如果沒有定義就使用默認的排序方式。默認的排序方式就是比較兩個元素的大小a>b?1:-1;我們可以給ab賦值,做一下實驗。a=12,b=5按照大於返回1,實際上也是返回1。按理說應該是可以進行排序的,但是為什么沒能實現排序,問題就處在a和b的類型上。datagrid查詢出數據到前端都屬於字符串的形式,例如給a="12",b="5",再比較大小,就會返回-1。如何解決呢,我們只需要在這里加上一個轉換即可,代碼如下:
1 var _4e8=opt.sorter||function(a,b){ 2 if(parseFloat(a)) 3 a = parseFloat(a); 4 if(parseFloat(b)) 5 b = parseFloat(b); 6 return (a>b?1:-1); 7 };
對兩個比較字符串進行轉換,轉換完之后再進行比較大小。而且不要擔心,ab是非數字的情況。
現在又一個更加麻煩的需求,在財務會計中金額往往都需要以千分位的方式顯示,這樣到前端就無法進行正常排序了。如何解決這個問題,有兩個方法。方法一,將千分位轉換放到前端來實現,給金額的options中定義一個formatter來進行格式化。方法二,在后台轉換千分位,在前端定義一個sorter比較大小方法。
按照源碼中的代碼可以看出我們還可以通過在options中定義sorter方法來設置比較方式。
HTML:
1 <table id="dg" class="easyui-datagrid" title="DataGrid Selection" style="width:700px;height:250px"
2 data-options="singleSelect:true,url:'../datagrid/datagrid_data1.json',sorter: sort()">
3 <thead>
4 <tr>
5 <th data-options="field:'itemid',width:80">Item ID</th>
6 <th data-options="field:'productid',width:100">Product</th>
7 <th data-options="field:'listprice',width:80,align:'right',sortable: true">List Price</th>
8 <th data-options="field:'unitcost',width:80,align:'right',sortable: true">Unit Cost</th>
9 <th data-options="field:'attr1',width:250">Attribute</th>
10 <th data-options="field:'status',width:60,align:'center'">Status</th>
11 </tr>
12 </thead>
13 </table>
JS代碼:先用replace方法將分隔符例如,轉換成空格,這樣就形成了一個可強轉的數字字符串。然后再
if(parseFloat(a)) 3 a = parseFloat(a); 4 if(parseFloat(b)) 5 b = parseFloat(b); 6 return (a>b?1:-1);
比較大小,同理,我們也可以定義一些其他的排序方式。今天就寫到這里。