JqGrid技术问题:获取单元格编辑输入文本并回写至表格
解决JqGrid自定义Formatter生成输入框后无法获取用户输入值的问题
你遇到的核心问题是:自定义Formatter渲染的输入框,其值并没有同步到JqGrid的内部数据存储中,所以你获取到的始终是控制器返回的原始值。下面给你两种实用的解决方案:
方案一:实时监听输入框变化,同步到JqGrid数据
这个方法会在用户输入内容时,立刻把新值更新到JqGrid的单元格数据里,确保后续获取数据时都是最新值。
步骤1:优化Formatter代码
首先,给输入框加上统一的类名(方便后续绑定事件),并默认填充原始值:
noAdjustAlertFormatter: function(cellvalue, options, rowObject){ if(rowObject.noAdjustAlert === 'Y'){ // 加上统一类名.alert-input,同时填充原始值 return '<input class="form-control input-sm alert-input" id="' + rowObject.storeId + 'alertInput" type="text" value="' + (cellvalue || '') + '">'; }else{ return ''; } }
步骤2:绑定输入框的change事件
在JqGrid初始化完成后,给所有输入框绑定change事件,实时更新JqGrid数据:
// 确保JqGrid渲染完成后绑定事件 $('#confirmTable').on('change', '.alert-input', function() { const $input = $(this); // 获取当前行的ID(因为你把storeId设为key,所以行ID就是storeId) const rowId = $input.closest('tr').attr('id'); const newValue = $input.val(); // 调用setCell更新JqGrid内部的单元格数据 $('#confirmTable').jqGrid('setCell', rowId, 'noAdjustAlert', newValue); });
这样之后,当你用getCell(rowId, 'noAdjustAlert')或者getRowData(rowId)获取数据时,就能拿到用户输入的最新值了。
方案二:提交时批量同步输入值
如果你不需要实时同步,只需要在提交表单/数据时一次性获取所有输入值,可以用这个方法:
function getAlertInputValues() { const inputData = []; // 遍历所有输入框 $('#confirmTable .alert-input').each(function() { const $input = $(this); const storeId = $input.attr('id').replace('alertInput', ''); const inputValue = $input.val(); // 同步到JqGrid数据(可选,如果之后还要用JqGrid的方法获取数据的话) $('#confirmTable').jqGrid('setCell', storeId, 'noAdjustAlert', inputValue); // 收集数据,方便后续提交到后端 inputData.push({ storeId: storeId, noAdjustAlert: inputValue }); }); return inputData; }
调用这个函数就能得到所有用户输入的留言数据,直接提交给后端即可。
为什么之前获取的是原始值?
JqGrid的单元格数据是存储在其内部的data对象中的,自定义Formatter只是负责生成前端显示的DOM元素,并不会自动把输入框的变化同步到内部数据。所以必须手动调用setCell方法,把输入框的新值更新到JqGrid的内部数据存储里,这样后续获取的数据才是最新的。
内容的提问来源于stack exchange,提问作者HanHan
相关产品推荐
相关产品推荐

