jqGrid有员工姓名和员工ID列。
如果employee name
已更改,则应调用服务器验证方法以验证名称。应该从此方法返回的数据更新当前行列。
如果employee id
已更改,则应调用服务器验证方法以验证ID。
应该从此方法返回的数据更新当前行列。
jqGrid最好保持编辑模式,以便用户可以继续更改,接受或拒绝更改。
如何在内联和表单编辑中实现此功能? 我正在考虑跟随可能性:
可能性1。
使用带有自定义验证器的editrules,如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如何从所有列获取数据,进行同步或异步调用以及使用此调用结果更新列。
可能性2。
要求用户按Enter键保存行。 问题:如何查找已更改的列并将此列号传递给服务器。 如何从服务器响应中更新当前行数据。
可能性3。
使用Oleg中描述的模糊答案 jqgrid change cell value and stay in edit mode
问题:如果输入数据并立即按下输入,则不会触发模糊。在这种情况下如何应用模糊?
总结服务器sice计算/验证应如下所示:
如果列中已更改并且焦点移出或按下更改列中的要保存,则服务器端同步或如果不可能则应调用异步方法。更改列名和当前编辑的行值(如编辑方法)将作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
更新
Oleg回答假定主键已被修改。这个因素并不重要。这是没有主键和其他更新的问题的新版本:
jqGrid有产品条形码和产品名称列。
如果product name
已更改,则应调用服务器验证方法以验证名称。应该从此方法返回的数据更新当前行列。
如果product barcode
已更改,则应调用服务器验证方法以验证产品条形码。
应该从此方法返回的数据更新当前行列。
jqGrid应保持编辑模式,以便用户可以继续更改,接受或拒绝更改。
如何在内联和表单编辑中实现此功能? 我正在考虑跟随可能性:
可能性1。
使用带有自定义验证器的editrules,如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如果输入元素失去焦点,则不会触发custom_func。在为所有元素保存之前调用它。所以它无法使用。
可能性2。
要求用户按Enter键保存行。 问题:如何查找已更改的列并将此列号传递给服务器。 Save方法应该是已知列(名称或条形码更改顺序)并填充不同的列。这看起来不合理。
可能性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 change cell value and stay in edit mode
要求摘要:
如果列中已更改并且焦点移出或按下更改列中的要保存,则服务器端同步或如果不可能则应调用异步方法。更改列名和当前编辑的行值(如编辑方法)将作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
UPDATE2
这个问题不是关于并发性的。这是单用户和jqGrid问题。更新意味着单个用户更改产品名称或条形码,服务器shoudl提供附加数据(产品ID和/或名称/条形码)是对此的响应。
更新4
我试过下面的代码。 如果用户输入新代码并按Enter键而不移动到其他行,则不会出现模糊,也不会调用验证。
如果单元格是脏的还是其他想法如果按下Enter键结束编辑而不丢失更改的外键单元格的焦点,如何在jqGrid保存方法中进行dedect?
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}
答案 0 :(得分:2)