jqGrid 有员工姓名和员工 ID 列。
If employee name
已更改,应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。
If employee id
已更改,应调用服务器验证方法来验证 id。
当前行列应根据此方法返回的数据进行更新。
最好 jqGrid 应保持在编辑模式,以便用户可以继续更改、接受或拒绝更改。
如何在内联和表单编辑中实现这一点?
我正在考虑以下可能性:
可能性1。
将 editrules 与自定义验证器一起使用,例如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如何从所有列获取数据、进行同步或异步调用以及使用此调用结果更新列。
可能性2。
要求用户按 Enter 键来保存行。
问题:如何找到更改的列并将该列号传递给服务器。
如何从服务器响应更新当前行数据。
可能性3。
使用模糊,如 Oleg 中所述,很好的答案jqgrid 更改单元格值并保持编辑模式 https://stackoverflow.com/questions/5247138/jqgrid-change-cell-value-and-stay-in-edit-mode
问题:如果输入数据并立即按下回车键,模糊不会触发。在这种情况下如何应用模糊?
总之,服务器端计算/验证应按如下方式完成:
如果列已更改并且焦点移出或在已更改的列中按 Enter 键进行保存,则服务器端同步或如果不可能,则应调用异步方法。更改的列名称和当前编辑的行值(如编辑方法中所示)将作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
Update
奥列格的回答假设主键已修改。这个因素并不重要。这是问题的新版本,没有主键和其他更新:
jqGrid 有产品条形码和产品名称列。
If product name
已更改,应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。
If product barcode
已更改,应调用服务器验证方法来验证产品条形码。
当前行列应根据此方法返回的数据进行更新。
jqGrid 应保持在编辑模式,以便用户可以继续更改、接受或拒绝更改。
如何在内联和表单编辑中实现这一点?
我正在考虑以下可能性:
可能性1。
将 editrules 与自定义验证器一起使用,例如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如果输入元素失去焦点,custom_func 不会触发。它在所有元素的保存之前调用。所以不能使用。
可能性2。
要求用户按 Enter 键来保存行。
问题:如何找到更改的列并将该列号传递给服务器。
保存方法应已知列(名称或条形码更改顺序)并填充不同的列。这看起来不太合理。
可能性3。
使用模糊:
colModel: [{"label":"ProductCode","name":"ProductCode","editoptions":{
"dataEvents":[
{"type":"focus","fn":function(e) { ischanged=false}},
{"type":"change","fn":function(e) {ischanged=true}},
{"type":"keydown","fn":function(e) {ischanged=true }},
{"type":"blur","fn":function(e) { if(ischanged) validate(e)} }
]},
为了实现验证,我在 Oleg 中找到了很好的答案jqgrid 更改单元格值并保持编辑模式 https://stackoverflow.com/questions/5247138/jqgrid-change-cell-value-and-stay-in-edit-mode
要求摘要:
如果列已更改并且焦点移出或在已更改的列中按 Enter 键进行保存,则服务器端同步或如果不可能,则应调用异步方法。更改的列名称和当前编辑的行值(如编辑方法中所示)将作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
Update2
这个问题与并发无关。这是单用户和 jqGrid 问题。更新意味着单个用户更改产品名称或条形码,服务器应提供附加数据(产品 ID 和/或名称/条形码)对此做出响应。
Update 4
我尝试了下面的代码。
如果用户输入新代码并按 Enter 键而不移动到其他行,则不会发生模糊并且不会调用验证。
如何在 jqGrid 保存方法中检测单元格是否脏或其他想法如何在按下 Enter 结束编辑时强制运行此代码而不失去更改的外键单元格的焦点?
function validate(elem, column) {
ischanged = false;
var i, form, row;
var postData = { _column: column };
var colModel = $("#grid").jqGrid('getGridParam', 'colModel');
var formEdit = $(elem).is('.FormElement');
// todo: use jQuery serialize() ???
if (formEdit) {
form = $(elem).closest('form.FormGrid');
postData._rowid = $("#grid").jqGrid('getGridParam', 'selrow');
for (i = 0; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + colModel[i].name + '.FormElement', form[0]).val() + '";');
}
else {
row = $(elem).closest('tr.jqgrow');
postData._rowid = row.attr('id');
for (i = 1; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + postData._rowid + '_' + colModel[i].name).val() + '";');
}
$.ajax('Grid/Validate', {
data: postData,
async: false,
type: 'POST',
success: function (data, textStatus, jqXHR) {
for (i = 0; i < data.length; i++) {
if (formEdit)
$('#' + data[i].name + '.FormElement', form[0]).val(data[i].value);
else
$('#' + postData._rowid + '_' + data[i].name).val(data[i].value);
}
}
});
}
colModel 定义为:
{"name":"ProductBarCode",
"editoptions": {"dataEvents":
[{"type":"focus","fn":function(e) {ischanged=false}
},
{"type":"change","fn":function(e) {ischanged=true},
{"type":"keydown","fn":function(e) {if(realchangekey()) ischanged=true}
},{"type":"blur","fn":function(e) { if(ischanged) { validate( e.target,ProductBarCode')}}
}]},"editable":true}