首先,我建议您不要将HTML片段放在JSON数据中。 可以使用自定义格式化程序在网格单元格内包含复选框:
formatter: function (cellvalue) {
return "<input type='checkbox' class='itmchk' ><strong>" +
$.jgrid.htmlEncode(cellvalue) + "</strong>";
}
为了控制复选框的选择/取消选择,您可以使用网格的
beforeSelectRow
回调。jqGrid内部将
click
事件绑定到网格主体上。因此,如果元素上不存在事件处理程序,则会发生
事件冒泡。它允许在一个
beforeSelectRow
回调中捕获任何复选框的选择/取消选择。在
beforeSelectRow
中,您应该首先测试是否点击了要控制的复选框。
回调
beforeSelectRow
有两个参数:
rowid
和
事件对象。事件对象的
target
属性将是用户单击的DOM元素。因为您为每个这样的复选框添加了自定义
itmchk
类,所以仅验证单击元素上的类就足够了。
下一个问题是,许多像
getNodeChildren这样与TreeGrid一起使用的jqGrid方法具有
record
作为输入参数,但您只有
rowid
。jqGrid在本地保存网格的加载项。因此,从
rowid
获取
record
的最简单方法是使用
getLocalRow
方法。
因此,
beforeSelectRow
回调代码可以如下所示:
beforeSelectRow: function (rowid, e) {
var $this = $(this),
isLeafName = $this.jqGrid("getGridParam", "treeReader").leaf_field,
localIdName = $this.jqGrid("getGridParam", "localReader").id,
localData,
state,
setChechedStateOfChildrenItems = function (children) {
$.each(children, function () {
$("#" + this[localIdName] + " input.itmchk").prop("checked", state);
if (!this[isLeafName]) {
setChechedStateOfChildrenItems($this.jqGrid("getNodeChildren", this));
}
});
};
if (e.target.nodeName === "INPUT" && $(e.target).hasClass("itmchk")) {
state = $(e.target).prop("checked");
localData = $this.jqGrid("getLocalRow", rowid);
setChechedStateOfChildrenItems($this.jqGrid("getNodeChildren", localData), state);
}
}
需要注意的是,子复选框只会在先前加载的项上被选中/取消选中。因为您一次性加载了网格的数据并使用了 loaded: true
属性,所以这对您来说不是问题。
相应的演示表明上述代码确实有效。这是我通过回答您之前的问题创建的演示的修改版。