是否有使用 jqgrid 的 getChangedCells 方法来确定数据是否已更改的示例?
我在 jqgrid 的可下载演示中 grepped getChangedCells,只能找到函数定义,而不是 getChangedCells 的示例用法。
如果用户单击另一行,我想要做的是保存用户所做的编辑。但是,如果该行是脏的,我只想提交保存。
提前致谢,--Nate
是否有使用 jqgrid 的 getChangedCells 方法来确定数据是否已更改的示例?
我在 jqgrid 的可下载演示中 grepped getChangedCells,只能找到函数定义,而不是 getChangedCells 的示例用法。
如果用户单击另一行,我想要做的是保存用户所做的编辑。但是,如果该行是脏的,我只想提交保存。
提前致谢,--Nate
行上没有安全的脏标志。您可以使用在行编辑开始时(内联编辑模式开始时)方法editRow将editable="1"
属性添加到网格行(<tr>
元素)的事实。稍后方法saveRow和restoreRow将属性值更改为editable="0"
。因此,当前页面中至少有一次处于内联编辑模式的行将具有该editable
属性。如果 table 元素的 id 是“list”,您可以找到已编辑的行
$("#list tr[editable]")
集合元素的 id 是行的 rowid。
如果在网格中使用分页,则应小心并在更改页面之前将已编辑行的 id 保存在当前页面上。onPaging事件将在这里为您提供帮助。
在我看来,做你需要的最好和最安全的方法是使用editRow或saveRowaftersavefunc
方法的参数(可能你只直接使用editRow)。在您的函数内部,您可以将修改后的行的 id 保存在数组/映射中。这将解决您的问题并安全工作。aftersavefunc
最后,我设法带了一段代码来检测我们想要什么;)
希望那里的任何 jqgrid 大师(如Oleg)都有足够的时间来审查这段代码并改进它。
示例代码将用于检测网格中更改的数据,其中包含名为"name"的可编辑字段。如果要检查更多列中的更改数据,则必须添加变量after_edit
并before_edit
与该列关联。
为了在函数中获取先前的单元格数据onSelectRow
,我没有使用该getCell
方法,因为在文档中以红色表示:
编辑行或单元格时不要使用此方法。这将返回单元格内容,而不是输入元素的实际值
遗憾的是,我可以检查文档是否正确 :(。但是该getCell
功能可以与当前单元格数据一起正常工作。
这是代码:
// Declare variables used for inline edit functionality.
var last_selected;
var before_edit_value;
var after_edit_value;
$('#grid-id').jqGrid({
...
onSelectRow: function(row_id){
if(row_id && row_id !== last_selected) {
/*
* Determine if the value was changed, if not there is no need to save to server.
*/
if (typeof(last_selected) != 'undefined') {
after_edit_value = $('#grid-id tr#' + last_selected + ' .name_column input').val();
}
if (before_edit_value != after_edit_value) {
/*
* Save row.
*/
$('#grid-id').jqGrid(
'saveRow',
last_selected,
function(response){
/* SuccessFunction: Do something with the server response */
return true;
},
'http://url.to.server-side.script.com/server-side-script.php',
{
additional_data: 'example: additional string',
});
}
else {
/*
* Restore the row.
*/
$('#grid-id').jqGrid('restoreRow', last_selected);
}
before_edit_value = $('#grid-id').jqGrid('getCell', row_id, 'name');
}
last_selected = row_id;
/*
* Edit row.
*/
$('#grid-id').jqGrid(
'editRow',
row_id,
true,
function() {/* OnEditFunction */},
function(response) {
/* SuccessFunction: Do something with the server response */
return true;
},
'http://url.to.server-side.script.com/server-side-script.php',
{
additional_data: 'example: additional string',
});
},
...
});
在我的一个项目中,我做了以下事情:在编辑行之前,我记得全局变量中的行数据,编辑完成后只需检查行数据是否已更改。像这样的东西(通过双击激活编辑模式):
var beforeEditData;
function onGridDblClickRow(id) {
if (isRowEditable(id)) {
beforeEditData = grid.getRowData(id);
grid.editRow(id, true, null, null, 'clientArray', null, onRowAfterEdit);
...
}
}
function onRowAfterEdit(row) {
var data = grid.getRowData(row);
if (!isDataChanged(beforeEditData, data)) {
return; // No changes
}
... // Save data here
}
function isDataChanged(before, after){
... // Allows tricky logic for dirty data, e.g. one may trim spaces etc.
}
使用 MVC4 和 JQuery 这就是我所做的
在视图中
<script type="text/javascript">
var $grid = $("#Grid");
var lastSelection;
var datachanged = false;
function gridInitialised() {
var headers = $('th>div>:input');
for (var h = 0; h < headers.length; headers[h++].onclick = (function () { if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; } }));
}
function editRow(id) {
if (id && id !== lastSelection) {
if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; }
$grid.restoreRow(lastSelection);
$grid.editRow(id, true);
var inputs = $('#'+id+'>td>:input[class="editable"]');
for (var i = 0; i < inputs.length; inputs[i++].onchange = (function () { datachanged = true; }));
lastSelection = id;
}
}
</script>
@Html.Trirand().JQGrid(Model.Grid, "Grid")
在模型中
Grid.ClientSideEvents.RowSelect = "editRow";
Grid.ClientSideEvents.GridInitialized = "gridInitialised";
gridInitialised 代码用于处理对搜索过滤器的更改。
戴夫
正如奥列格在 5 年前(哇)提到的那样 - 我使用了 saveRow 函数并将标志传递为extraparam
.
像这样,假设您的“模型”或IsDirty
在我的情况下隐藏列:
onSelectRow: function(id) {
if (id && id !== lastgridsel) {
$("#myGrid").saveRow(lastgridsel, false, "clientArray", { IsDirty: "True" });
$("#myGrid").editRow(id, true, null, null, "clientArray");
lastgridsel = id;
}
},
然后遍历保存单击(在我的情况下为外部按钮)上的行,类似于:
$("#gridSaveBtn").on("click", function() {
var batch = new Array();
var dataIds = $("#myGrid").jqGrid("getDataIDs");
for (var i = 0; i < dataIds.length; i++) {
try {
$("#myGrid").jqGrid("saveRow", dataIds[i], false, "clientArray");
//get row data
var data = $("#myGrid").jqGrid("getRowData", dataIds[i]);
if (data["IsDirty"] === "True") {
batch.push(data);
}
} catch (ex) {
alert(ex.Message);
$("#myGrid").jqGrid("restoreRow", dataIds[i]);
}
}
});