obj.data是当前行原始数据对象,直接可用且包含所有字段;obj.field是被编辑列名,obj.value是新值;它非DOM文本或templet处理结果,而是原始JSON快照,编辑前旧值可通过obj.data[obj.field]安全获取。
edit事件里obj.data就是当前行原始对象
不需要额外查找或遍历,obj.data 在 table.on('edit(filter)') 回调中直接可用,它就是该单元格所在行的完整原始数据对象(即你传给 data 或服务端返回的那条记录)。
- 这个对象包含所有字段,哪怕某些字段没在
cols中配置显示,只要后端返回了、或前端 data 数组里有,就都在obj.data里 -
obj.field是当前被编辑的列名(如"username"),obj.value是新输入的值,obj.data是整行上下文 - 注意:它不是渲染后的 DOM 文本,也不是经过
templet处理后的结果,而是原始 JSON 数据
为什么不能用 $(obj.tr).data() 或 DOM 上取值?
因为 Layui 编辑时会临时插入 input,DOM 结构是动态生成的,且 tr 元素本身不挂载数据对象。靠 $(obj.tr).closest('tr').data('index') 再去查 table.cache 是绕远路,还容易在分页/排序后出错。
-
obj.tr只用于定位 DOM,不能反推数据;obj.dataIndex字段虽存在,但它是当前页缓存下标,不是全局索引 - 如果表格启用了
page: true,table.cache里只有当前页数据,而obj.data始终准确对应本次编辑行的原始快照 - 实测中,即使某列用了
templet: function(d) { return d.status === 1 ? '启用' : '停用'; },obj.data.status仍是数字1,不是字符串"启用"
如何安全访问修改前的值?
别依赖 DOM 文本提取,直接用 obj.data[obj.field] 就是编辑前的原始值——这是最稳的方式。
- 例如编辑
price字段:const oldPrice = obj.data.price;,const newPrice = obj.value; - 如果字段是嵌套的(如
info.amount),确保你在初始化时传的数据结构里真有这层,否则obj.data.info?.amount会是undefined - 避免用
$(obj.tr).find('td[data-field="price"] div').text(),这种写法在templet渲染非纯文本内容(比如带按钮、图标)时必然失效
edit事件触发时机与数据一致性
edit 是同步触发的,发生在 input 失去焦点、值已确认但尚未写入 DOM 的瞬间,此时 obj.data 和 obj.value 都已就绪,且 obj.data 是不可变快照。
- 如果你在回调里做了异步操作(如校验后发请求),不要假设
obj.data会随后续用户操作变化——它不会 - 但要注意:如果同一行多个字段被快速连续编辑,每次
edit触发时的obj.data都是初始状态,不是上一次编辑后的结果(Layui 不自动更新原始对象) - 所以批量校验多字段时,得自己缓存或比对,不能依赖多次
obj.data的链式变化
url 异步加载 + page: true 时,obj.data 仍只反映当前页响应体里的那条记录,它不会帮你跨页查原始全量数据。如果业务需要“编辑后立刻对比历史版本”,那个“历史版本”必须由你提前存好,Layui 不维护数据变更日志。











