需求:
要实现的效果是输入一个整数数字,实现排序;排序是监听排序事件,并不是简单的前端排序,后端数据排序;
1、前端增加按钮和下拉框:
<div class="layui-input-inline layui-input-sm m-r-5">
<input type="text" class="layui-input" id="totalCheck" placeholder="请输入检测次数"οnkeyup="this.value=this.value.replace(/\D/g,'')"/>
</div>
<div class="layui-input-inline layui-input-sm " style="width:80px;" id="totalCheckStatus">
<select>
<option value="0">等于</option>
<option value="1">大于</option>
<option value="2">小于</option>
</select>
</div>
注意事项:里面多了一个onkeyup事件,用来限定输入的值只能是数字。如果是非数字字符,会强制性的清空内容;
2、监听排序事件:
在表格渲染的时候设置autoSort属性为false,另外在要进行排序的字段中,设置 sort:true;
table.on('sort(dataTable)', obj => { table.reload('dataTable', { initSort: obj , where: { orderField: obj.field , orderType: obj.type } }); });
问题1:field字段列没有填数据的后果,不管你用了模板,最好还是把字段加上,不然连监听排序事件都不会进去;
会报错:Layui hint: Table modules: Did not match to field
问题2:点击之后,不是按条件查到的数据排序,又变成了新的没有经过筛选的数据;也就是说没有将之前按条件拿数据
的时候的条件进行保存;认真参考官方文档数据表格部分的排序切换,搞懂传的字段意思和进行服务端排序的要点。
3、后端服务层具体实现
关键步骤:我前端传的是两个数字,一个是次数,一个是下拉选择框的值;
点击搜索的时候将这两个值一起塞到DATA数组里面,并在后台接收,另外第一次进去的时候记得带上一个默认值;
不然会报错进不去serviceimpl实现类,会报空指针;
where: {loginKey: APP.getHeaders()['loginKey'], 'totalCheckStatus': 0, 'totalCheck': -1}
let totalCheckStatus = $("#totalCheckStatus").find('.layui-this').attr('lay-value');
let totalCheck = $("#totalCheck").val() || -1;
$DATA['totalCheckStatus'] = totalCheckStatus;
$DATA['totalCheck'] = totalCheck;
if (check != -1) { WHERE_SQL += " AND UC.total_check "; switch (checkStatus) { case 0: WHERE_SQL += " = :totalCheck "; break; case 1: WHERE_SQL += " > :totalCheck "; break; case 2: WHERE_SQL += " < :totalCheck "; break; } paramValueMap.put("totalCheck", check); }
COUNT_SQL += WHERE_SQL; if (!Lun51Utils.isEmpty(orderField) && !Lun51Utils.isEmpty(orderType)) { if ("totalCheck".equals(orderField)) { if ("desc".equals(orderType)) { WHERE_SQL += " ORDER BY UC.total_check DESC "; } else if ("asc".equals(orderType)) { WHERE_SQL += " ORDER BY UC.total_check ASC "; } } }
拿数据最后走的是namedParameterJdbcTemplate.queryForList(QUERY_SQL, paramValueMap)这种方式,map里面塞的是所有查询条件,查询语句用到的具名参数的地方都是从这个map里面拿;
问题3:拿到的数据明明是对的,值和顺序都是对的,可是放到HashMap中还是没按降序或者自己想要的顺序,是真的坑,后来打断点,调试,就是那一个塞的动作就把顺序打乱了;后来想到一个办法,用LinkedHashMap装,这种容器你存的时候是什么顺序,往外取的时候就是什么顺序。