まず、JSONデータ内にHTMLフラグメントを配置しないことをお勧めします。カスタムフォーマッタを使用して、グリッドセル内にチェックボックスを含めることができます。
formatter: function (cellvalue) {
return "<input type='checkbox' class='itmchk' ><strong>" +
$.jgrid.htmlEncode(cellvalue) + "</strong>";
}
チェックボックスのチェック/チェック解除を制御するbeforeSelectRow
には、グリッドのコールバックを使用できます。jqGridは、内部的click
にイベントをグリッド本体にバインドしました。したがって、イベントバブリングが発生する要素に直接イベントハンドラーは存在しません。これにより、1つのコールバック内のチェックボックスのチェック/チェック解除をキャッチできます。beforeSelectRow
内部でbeforeSelectRow
は、最初に、制御するチェックボックスをクリックしたかどうかをテストする必要があります。
コールバックbeforeSelectRow
には2つのパラメータがあります:rowid
とイベントオブジェクト。イベントオブジェクトのプロパティtarget
は、ユーザーがクリックしたDOM要素になります。このようなすべてのチェックボックスにカスタムitmchk
クラスを追加するため、クリックした要素のクラスを確認するだけで十分です。
次の問題は、 getNodeChildrenのようにTreeGridで動作する多くのjqGridメソッドが入力パラメーターとして持っていることですが、代わりにrecord
しかありませんrowid
。jqGridは、グリッドのロードされたアイテムをローカルに保存します。したがって、から取得する最も簡単な方法record
は、メソッドrowid
を使用する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
プロパティを使用するので、問題はありません。
対応するデモは、上記のコードが実際に機能することを示しています。これは、前の質問に答えて作成したデモの変更です。