2021-02-03 layui 数据表格 实现全局排序

layui 数据表格在展示数据时 虽然感觉样式不是很好看,但是他的各种功能做的感觉还是比较完善,包括可以兼容在各种分辨率 下显示完整的数据,排序等等。
在table的表头参数里加上sort :true,就回开启排序,但是这种排序只是按照该字段的升序或者降序的顺序 将当前页的数据进行分页,点击某字段的排序时,layui只会将当前页的数据进行排序,这肯定是不满足需求的,需要在点击某字段的排序时,可以将查询的所有数据进行排序。
在这里插入图片描述

  • 1 首先需要在表头加上这些排序按钮,在需要进行排序的 表头参数里加上sort :true

 layui.use('table', function(){
  var table = layui.table;
  table.render({
    elem: '#test'    //html中table的id为test
    ,url:'/demo/table/user/'
    ,cols: [[
      {field:'id', width:80, title: 'ID', sort: true}
      ,{field:'username', width:80, title: '用户名'}
      ,{field:'score', width:80, title: '评分', sort: true}
      ,{field:'classify', width:80, title: '职业'}
      ,{field:'wealth', width:135, title: '财富', sort: true}
    ]]
    ,page: true
  });
});
  • 2 需要监听排序事件,当点击某个字段的升序或者降序按钮时 对数据进行处理。
<div>
<table id="test" lay-filter="test01"  >  </table>
</div>
<script>

table.on('sort(test01)', function(obj){ //注:sort是写死的,监听的是表头的排序按钮的点击事件,test是table原始容器的属性 lay-filter="对应的值"
				  console.log(obj.field); //当前排序的字段名
				  console.log(obj.type); //当前排序类型:desc(降序)、asc(升序)、null(空对象,默认排序)
				  console.log(this); //当前排序的 th 对象
				  
				  //尽管我们的 table 自带排序功能,但并没有请求服务端。
				  //有些时候,你可能需要根据当前排序的字段,重新向服务端发送请求,从而实现服务端排序,如:
				  table.reload('testTable', { //testTable是表格容器id
				    initSort: obj //记录初始排序,如果不设的话,将无法标记表头的排序状态。 layui 2.1.1 新增参数
				    ,where: { //请求参数(注意:这里面的参数可任意定义,并非下面固定的格式)
				      field: obj.field //排序字段 对应的表头参数的filed值,
				      ,order: obj.type //排序方式  desc||asc
				    }
				  });
				});
//我们只需要在向后端查询数据发参数时携带上排序字段和排序规则(desc||asc),后端接收一下排序字段并组织到查询数据的sql里,这样就可以实现对数据的全局排序了,在一开始的时候需要初始胡排序字段,我们需要对initSort:obj 的obj对象进行一下初始化,格式为{field:’id‘,type:’desc‘},这样的话可以默认为按照id降序排列;
</script>
  • 3 如果我们表头参数里field的值与字段不同名

我们可以加一个对象或者map来存储 layui 数据表格 filed 的值与数据库的表字段的属性名,比如数据表格的某一列 field值为 name,表字段的属性名为uname,存储name 与uname的对应关系,在发送参数的时候进行一下转换就可以了。

var dic = {name: 'uname' };//定义好表格field 与数据库表字段的属性名的对应关系。

where :{
   field: dic[obj.field] ,//排序字段 对应的表头参数的filed值,
   order: obj.type //排序方式  desc||asc
}
//在发送参数时取field对应的表字段发送到后端就可以了。
<think>嗯,用户问的是如何在Layui框架中为多个表格的表头单元格添加事件。首先,我需要回忆一下Layui表格组件结构。Layui表格渲染后,表头部分通常是由th元素组成的,所以需要找到这些元素并绑定事件。 但用户提到页面中有多个表格,这就需要注意事件绑定的作用域问题,避免不同表格之间的事件冲突。可能需要为每个表格单独处理,或者通过选择器来区分不同的表格。 我记得Layui渲染表格是异步的,所以直接使用jQuery在页面加载时绑定事件可能不起作用,因为那时候表格还没渲染完成。应该在表格渲染完成的回调函数里进行事件绑定。比如使用done回调,或者使用form.on事件。 另外,表头单元格的事件可能需要委托,因为动态生成的元素直接绑定事件可能无效。可以使用jQuery的on方法,委托到父元素,比如.layui-table-header上,这样即使表格是动态生成的,事件也能被捕获。 然后,具体到每个表格,可能需要通过表格的id或者索引来区分。比如,每个表格有一个不同的id,在事件处理函数中通过this来获取当前的th元素,再找到对应的表格实例。 另外,Layui表格实例可以通过lay-filter属性来获取,使用table.cache或table.checkStatus等方法可能需要实例的id。所以,在渲染每个表格时,设置不同的lay-filter,然后在事件处理中根据lay-filter来获取对应的表格实例。 举个例子,用户有两个表格,分别用id="table1"和id="table2",在done回调里,遍历每个表格的th元素,绑定点击事件。或者使用事件委托,在父容器上绑定事件,然后根据事件目标判断是哪个表格的th被点击。 还需要考虑事件冒泡和阻止默认行为,比如点击表头可能触发排序,如果用户不希望这样,可能需要阻止默认行为。或者结合Layui的自带排序功能来处理。 另外,测试代码的时候,可能需要确认事件是否被正确绑定,是否能够正确区分不同的表格,以及获取到正确的表头单元格信息。比如在事件处理函数中,获取th的索引、内容,或者对应的字段名,然后执行相应的操作。 可能还需要参考Layui的文档,确认是否有内置的方法或者事件可以用于表头单元格的事件处理。如果官方文档中没有提到,可能需要通过DOM操作来实现。 总结步骤应该是:1. 在渲染每个表格时,使用done回调确保DOM已生成;2. 使用事件委托或直接绑定th元素的事件;3. 在事件处理中区分不同的表格实例;4. 执行具体的业务逻辑,如弹窗、请求数据等。 另外,用户提到的多个表格的情况,可能需要循环处理每个表格,或者在渲染每个表格时单独处理其事件绑定,避免重复或遗漏。</think>在Layui框架中为多个表格的表头单元格添加事件,需结合DOM查询和事件委托机制。以下是具体实现步骤: ### 一、基础表格渲染 为每个表格设置唯一标识`lay-filter`,区分不同表格实例: ```javascript layui.use('table', function(){ var table = layui.table; // 第一个表格 table.render({ elem: '#table1', filter: 'table1-filter', // 唯一过滤器标识 // ...其他配置 }); // 第二个表格 table.render({ elem: '#table2', filter: 'table2-filter', // 唯一过滤器标识 // ...其他配置 }); }); ``` ### 二、事件绑定方案 #### 方案1:使用`done`回调(推荐) 在表格渲染完成后直接绑定事件,利用事件委托处理动态DOM: ```javascript table.render({ elem: '#table1', done: function(){ $(this.elem).find('.layui-table-header').on('click', 'th', function(){ const field = $(this).data('field'); console.log('点击表头字段:', field); // 通过table.cache获取对应表格数据 const tableData = table.cache['table1-filter']; // 引用[2] }); } }); ``` #### 方案2:全局事件监听 通过`lay-filter`识别具体表格: ```javascript $('.layui-table-header').on('click', 'th', function(){ const tableFilter = $(this).closest('.layui-table-box') .prev().attr('lay-filter'); const field = $(this).data('field'); if(tableFilter === 'table1-filter'){ // 处理第一个表格逻辑 } else if(tableFilter === 'table2-filter'){ // 处理第二个表格逻辑 } }); ``` ### 三、多表格事件隔离 使用闭包实现事件作用域隔离: ```javascript function initTable(tableId, filterName) { table.render({ elem: tableId, filter: filterName, done: function(){ $(this.elem).find('th').off('click.custom').on('click.custom', function(){ // 独立的事件处理逻辑 }); } }); } // 初始化多个表格 initTable('#table1', 'filter1'); initTable('#table2', 'filter2'); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值