谈谈 table 的 sort

分享 已结 精帖 107 9820
岁月小偷
悬赏:80飞吻
更新于随着2.4.4的到来这个问题应该是得到处理了,新增了一个autoSort的配置来决定是否执行前台的自动排序,所以如果是后台排序的记得要给这个选项设置成false即可,如果没有设置,默认是true实际就是即使你监听了table的sort然后重新请求了,回来的数据在渲染的时候还是会走一次前端的sort,最终的顺序就无法保证跟后天排序好的顺序了,所以autoSort是一个关键。结贴[嘻嘻] [嘻嘻] [嘻嘻]
今天来谈谈table sort的那点事。预告一下,目的是做到前台排序还有服务器排序区分开,目前的table的分页实际是比较“乱”的,相信很多用的有一段时间的特别是做server排序的同学都会多多少少遇到不正常的情况。
先看看目前layui自带的排序的效果,中文按字典排序这些不是本次讨论的重点,先看看如果存在整数负数还有0出现的情况

那么是不是调整一下sort里面的逻辑就可以了让它对负数和0的判断逻辑对了就好了。好吧,这个其实也不是这次讨论的重点。
那么重点是,server排序,实际上绝大部分的table的排序不会只是单页面的这样子简单的排序,而是把条件传到后台让后台排序,那么官方给出的一般是监听sort然后reload,把条件传过去,这些都很ok,逻辑都没问题,but实际得到的效果呢?因为目前table没有区分前台排序还是server排序,在接收到数据之后再渲染表格的时候判断到有initSort,那么会再次将数据排序,然后显示,这就存在一个非常严重的问题!明明server已经排好序了,为啥还要js里面再sort一下,更严重的是,能保证sort出来的结果跟后台排序的规则出来的结果一致么?拿什么保证呢?看看下面的代码监听reload的时候然后模拟后台把数据按照负数<0<正数这个规则返回的data,实际reload之后是什么样子吧。
代码

效果

可能你会觉得跟前面没啥区别呀,排序的时候还是错了呀,这正是异常的地方。看看我模拟返回的data里面的结构吧
原始的data:

模拟的接口返回的data:

这个返回之后显然显示的效果跟实际数据的顺序对不上号

原因就是上面说的,实际发后台排序的时候到了渲染的时候还是要走一次前台排序,等于是做了一个画蛇添足的处理。实际如果我们定义成server排序返回的数据就是要显示的顺序了,绝对不能再走前端sort一下这个逻辑,不然后台排序的意义是什么还有如何保证逻辑跟后台是一致的,一致的话顶多算是一个无用功,但是如果不能保证一致,这个就是一个大事故了。
解决方案:提供用户一个配置项,决定是前台排序还是server排序。修改如下
需要修改的原始代码区域

修改之后的对应区域的代码:

测试的table在render的时候加入了sortType的配置

最后是sort的监听

最后的效果

完整的测试代码还有对table.js的对应修改的地址: https://pan.baidu.com/s/1OjwwVmjy02wRQ0rT1euLlQ
写在最后:实际这个到这里基本就可以了,但是其实还有一个可以优化的,就是假定加入了sortType的设定之后,那么实际点击排序的时候应该在table里面就自己去reload了而不用多此一举的自己还添加sort监听然后再里面执行reload,但是这个要让table自己去reload就涉及到接口的参数问题,不过处理也不是很难哈,这里抛砖引玉,如果自己觉得这个功能适合自己的话可以试着在这个基础上去调优,做到不需要自己监听sort而是设置sortType的类型就可以让它自己去再次发起请求。如果需要提供的话可以回帖,我进一步整理之后再追加出来[微笑]
※更新于:2018年9月14日08:48:49
对sortKey的逻辑稍加修改,这个不管是前端排序还是服务端排序都要维护的,避免重复操作,原始代码中再默认排序的时候会删除,在上面代码的基础上稍加调整为:
回帖
  • Xinu
    2018-9-13
    @岁月小偷 非常蛋疼的痛点。大佬。能不能把改过的table重新封装成第三方的扩展,像这种排序类似的痛点问题都给解决了。拜谢!!![威武] [威武] [威武] [威武] [威武]
    5 回复
  • @岁月小偷 老哥能的这些完全就是table的痛点,我就不明白为什么贤心每次更新都不去解决这些基础问题,一直在增加"前端"功能,前端功能,匪夷所思,都是增加的鸡肋功能
    4 回复
  • 我现在都怀疑不是贤心写的了,水平感觉有限
    4 回复
  • table.dataParams = ['url', 'method', 'where', 'contentType', 'headers', 'parseData', 'request', 'response', 'data', 'page'];
    这个应该加上initSort吧??
    4 回复
  • JuggerHoo
    2018-9-17
    @岁月小偷 我在官网上下的就是这样的。。,哪里下到源码版本?
    3 回复
  • @岁月小偷 能否把改的那个reload和这个排序的一个发个table.js,你讲的都是痛点,厉害啊老哥
    2 回复
  • @火箭总冠军 具体得看代码,光这个描述比较模糊,不知道你说的是在目前sort的基础上添加的这个beforeSort还是完全舍弃原有sort的逻辑自己写的一套从维护样式到事件监听啥的。如果还是走sort,只是在beforesort里面请求数据排序,最后只要还是走sort后面的处理的话还是会导致后端传过来的数据会被table再sort一下的,这个解决的不是说不能后端排序,而是后端排序之后回来table还自己排一次导致的问题。
    2 回复
  • Pojin
    2018-9-16
    good job
    2 回复
  • 厉害了[good]
    2 回复
  • @JuggerHoo 你这个是经过混淆压缩的,改起来非常麻烦的,建议把这个问题替换成未压缩混淆的,要在混淆上修改也不是改不了,就是可读性比较差,不多耐心的看耐心的读他的代码还要用关键字找到对应的位置,对比源码的还有混淆的之间的区别。利用一些方法去修改,把混淆的还有源码的变量给对应起来,基本就可以了,不过最好还是通过源码版本的修改最后项目发布的时候再把代码压缩成发布版的这样子的方式来改比较好。
    2 回复