easyui实现datagrid数字排序问题
我们在使用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);
比较大小,同理,我们也可以定义一些其他的排序方式。今天就写到这里。