table.on('tool(filter)') 事件必须在 table.render() 后绑定,filter 值须与 lay-filter 完全一致;常见失效原因包括监听写在 render 前、容器缺失 lay-filter、混淆 tool 与 row 等事件类型;点击后可通过 obj.update 局部更新或 table.reload 全量刷新,并需注意 page.curr、状态同步及错误回滚。
table.on('tool(filter)') 事件绑定必须在 render 之后
行工具栏按钮(如“编辑”“删除”)点击后触发的事件,靠 table.on('tool(filter)', callback) 监听,filter 必须和 table.render({ lay-filter: 'xxx' }) 中的字符串完全一致。常见失效原因:监听写在 table.render() 前、容器没加 lay-filter 属性、或把 tool 误写成 row 或 event。
示例中若渲染时写了 lay-filter="userTable",那监听就必须是:table.on('tool(userTable)', function(obj){...})。漏掉括号里的字符串匹配,回调函数永远不会执行。
点击按钮后如何发起异步请求并刷新当前行或整表
工具栏点击后通常要拉新数据——比如“审核”按钮点完要更新该行状态,或“详情”按钮要弹窗加载关联数据。关键不是“发请求”,而是“怎么让表格响应变化”:
- 只改单行显示:用
obj.update({ status: 'approved', statusText: '已通过' }),它会局部重绘该行,不触发全表 reload - 刷新整表(含分页/排序状态):调用
table.reload('userTable', { where: { ... }, page: { curr: obj.curr } }),注意必须传page.curr,否则默认跳回第 1 页 - 避免重复请求:按钮点击后可先禁用,等接口返回再恢复,例如
$(obj.tr).find('.layui-btn').addClass('layui-disabled')
templet 渲染的按钮如何拿到真实数据 ID
工具栏模板里常写 <button data-id="{{d.id}}">操作</button>,但实际点击时 obj 参数里 obj.data.id 就是原始数据字段,不需要额外从 DOM 取。直接用更安全:
table.on('tool(userTable)', function(obj){<br> var id = obj.data.id; // 不要用 $(this).data('id')<br> $.post('/api/approve', { id: id }, function(res){<br> if(res.code === 0){<br> obj.update({ status: res.data.status });<br> }<br> });<br>});
如果用了 parseData 或后端返回结构嵌套(如 { code: 0, data: [...] }),obj.data 仍是解包后的单行对象,字段名以你配置的 cols 中 field 为准。
异步请求失败时表格状态怎么保持一致
网络错误或后端报错后,用户看到的还是旧数据,但表格内部状态可能已混乱。最容易被忽略的是:手动调用 obj.update() 后又 reload 整表,会导致刚 update 的临时状态被覆盖。
建议统一处理逻辑:
- 成功:用
obj.update()局部更新,或table.reload()全量刷新 - 失败:显式还原字段值,例如
obj.update({ status: oldStatus }),不能只靠 UI 提示 - loading 状态别只靠按钮禁用——表格行本身可加 class 标记,比如
obj.tr.addClass('loading'),done 回调里再移除
真正麻烦的不是发请求,而是确保视觉、DOM、缓存三者始终对齐。Layui 的 table.cache 和 obj.data 不自动同步,改了 data 得主动调用 update 或 reload。











