【发布时间】:2011-10-01 09:28:48
【问题描述】:
jqGrid 有员工姓名和员工 ID 列。
如果employee name 已更改,则应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。
如果employee id 已更改,则应调用服务器验证方法来验证 id。
当前行列应根据此方法返回的数据进行更新。
jqGrid 最好保持在编辑模式,以便用户可以继续更改、接受或拒绝更改。
如何在内联和表单编辑中实现这一点? 我正在考虑以下可能性:
可能性 1.
使用带有自定义验证器的编辑规则,例如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如何从所有列中获取数据、进行同步或异步调用以及使用此调用结果更新列。
可能性 2。
要求用户按 Enter 键保存行。 问题:如何查找更改的列并将此列号传递给服务器。 如何根据服务器响应更新当前行数据。
可能性 3.
使用模糊中描述的奥列格很好的答案 jqgrid change cell value and stay in edit mode
问题:如果输入数据并立即按下输入,模糊不会触发。在这种情况下如何应用模糊?
总而言之,服务器计算/验证应按如下方式进行:
如果更改的列和焦点移出或在更改的列中按下输入以保存,服务器端同步或如果不可能,则应调用异步方法。更改的列名和当前编辑的行值(如在 edit 方法中)作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
更新
Oleg 回答假定主键已修改。这个因素并不重要。这是没有主键和其他更新的新版本问题:
jqGrid 有产品条形码和产品名称列。
如果product name 已更改,则应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。
如果product barcode 已更改,则应调用服务器验证方法来验证产品条形码。
当前行列应根据此方法返回的数据进行更新。
jqGrid 应保持在编辑模式,以便用户可以继续更改、接受或拒绝更改。
如何在内联和表单编辑中实现这一点? 我正在考虑以下可能性:
可能性 1.
使用带有自定义验证器的编辑规则,例如
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 change cell value and stay in edit mode
需求总结:
如果更改的列和焦点移出或在更改的列中按下输入以保存,服务器端同步或如果不可能,则应调用异步方法。更改的列名和当前编辑的行值(如在 edit 方法中)作为参数传递给此方法。
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。
更新2
这个问题与并发无关。这是单用户和 jqGrid 问题。更新意味着单个用户更改产品名称或条形码,服务器应提供附加数据(产品 ID 和/或名称/条形码)作为对此的响应。
更新 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}
【问题讨论】:
-
在我看来,数据的服务器端验证是保存数据的一部分,所以我写了我的答案,其中描述了如何检测特别是并发错误。跨度>
标签: jqgrid