在我的 jqGrid 中,我有一个也可用于编辑的复选框,即用户可以单击该复选框,并且该复选框的值将在数据库中更新。效果很好。但是,当我单击该复选框并尝试再次单击它时,什么都没发生。该行不会被保存。理论上应该保存复选框未选中的值。但这并没有发生。
我尝试过参考this奥列格的回答但这没有帮助。
奇怪的问题是,如果我选择另一行,然后尝试再次取消选择该复选框,我确实会看到保存请求。
我猜这是因为我正在尝试编辑当前选定的行。但我不确定我在这里做错了什么。
这就是我正在做的事情beforeSelectRow
beforeSelectRow: function (rowid, e) {
var $target = $(e.target),
$td = $target.closest("td"),
iCol = $.jgrid.getCellIndex($td[0]),
colModel = $(this).jqGrid("getGridParam", "colModel");
if (iCol >= 0 && $target.is(":checkbox")) {
if (colModel[iCol].name == "W3LabelSelected") {
console.log(colModel[iCol].name);
$(this).setSelection(rowid, true);
$(this).jqGrid('resetSelection');
$(this).jqGrid('saveRow', rowid, {
succesfunc: function (response) {
$grid.trigger('reloadGrid');
return true;
}
});
}
}
return true;
},
配置:
jqGrid版本:最新免费jqGrid
数据类型:Json 保存到服务器
最小电网代码: jsFiddle
EDIT:在奥列格的回答之后,这就是我到目前为止所得到的:
beforeSelectRow: function (rowid, e) {
var $self = $(this),
iCol = $.jgrid.getCellIndex($(e.target).closest("td")[0]),
cm = $self.jqGrid("getGridParam", "colModel");
if (cm[iCol].name === "W3LabelSelected") {
//console.log($(e.target).is(":checked"));
$(this).jqGrid('saveRow', rowid, {
succesfunc: function (response) {
$grid.trigger('reloadGrid');
return true;
}
});
}
return true; // allow selection
}
这很接近我想要的。但是,如果我第一次和第二次选中该复选框,console.log
每次都会被叫到。但是,那saveRow
仅当我选中该复选框,然后再次单击它以取消选中它时,才会被调用,此后就不再调用。默认情况下,可以根据服务器发送的数据选中或取消选中该复选框。
在图中,请求是在选中复选框两次后发送的,而不是每次都发送。
UPDATE:根据@Oleg的建议,我已经实施了cellattr
并在里面调用了一个函数。在函数中,我只需传递 rowid 并更新服务器上该 rowid 的复选框。
这是我使用的代码:
{
name: 'W3LabelSelected',
index: 'u.W3LabelSelected',
align: 'center',
width: '170',
editable: false,
edittype: 'checkbox',
formatter: "checkbox",
search: false,
formatoptions: {
disabled: false
},
editoptions: {
value: "1:0"
},
cellattr: function (rowId, tv, rawObject, cm, rdata) {
return ' onClick="selectThis(' + rowId + ')"';
}
},
和我的 selectThis 函数:
function selectThis(rowid) {
$.ajax({
type: 'POST',
url: myurl,
data: {
'id': rowid
},
success: function (data) {
if (data.success == 'success') {
$("#list").setGridParam({
datatype: 'json',
page: 1
}).trigger('reloadGrid');
} else {
$("<div title='Error' class = 'ui-state-error ui-corner-all'>" + data.success + "</div>").dialog({});
}
}
});
}
FIDDLE