私自身は Zend Framework を使用していません。したがって、私の提案は一般的であり、使用するフレームワークには依存しません。
以下の例では、グリッド上で動的に設定onSelectRow
して行選択のインライン編集を実装する方法を示します。editable: true
のプロパティcolModel
やオプションなどの他の必要な設定editurl
は、グリッドに既に存在していると思います。onSelectRow
そのため、動的の設定のみを示します。
最初の方法は、 を使用してコールバックsetGridParam
を設定することです。onSelectRow
対応するデモでは、次のコードを使用します。
$(function () {
var $grid = $("#list"),
editingRowId,
myInlineEditingOptions = {
keys: true,
oneditfunc: function (id) { editingRowId = id; },
afterrestorefunc: function () { editingRowId = undefined; },
aftersavefunc: function () { editingRowId = undefined; }
};
$grid.jqGrid({
datatype: 'local',
....
editurl: 'clientArray'
});
// now we set or change onSelectRow callback AFTER jqGrid is created
$grid.jqGrid('setGridParam', {
onSelectRow: function (id) {
if (id !== editingRowId) {
if (typeof editingRowId !== "undefined") {
// save previously editing row
//$(this).jqGrid("saveRow", editingRowId, myInlineEditingOptions);
// discard changes from the previously editing row
$(this).jqGrid("restoreRow", editingRowId, myInlineEditingOptions);
}
// start inline editing. The user should save the row by pressing ENTER
$(this).jqGrid("editRow", id, myInlineEditingOptions);
}
}
});
});
上記のシナリオでは、次のことに言及することが重要です
- jqGrid の作成
onSelectRow
後に設定 (または変更)できます。
- グリッド内のコールバックは1 つだけ です。
onSelectRow
新しいonSelectRow
コールバックを設定すると、既存のコールバックが上書きされます。
最後の制限は非常に難しい場合があります。onSelectRow
たとえば、プロジェクト内のすべてのグリッドに対して実行する必要があるいくつかのデフォルト アクションを実装し、追加の特定のアクションに追加onSelectRow
を使用することはできません。これが、コールバックに非常に近い形式で使用できる jQuery のようなイベントを導入した主な理由でした。次の例は、この手法を示しています。
次のデモは前のデモとまったく同じように機能しますが、コールバックjqGridSelectRow
の代わりにイベントを使用しonSelectRow
ます。新しい技術には2つの重要な利点があります
- jqGrid が作成される前またはその後に
jqGridSelectRow
、イベント ハンドラーを設定できます。jQuery.bindを使用してイベント ハンドラーをバインドする場合、グリッドに変換される要素が存在する必要があります。もう少し遅いjQuery.delegate、jQuery.liveまたはjQuery.on (最後のものは jQuery 1.7 から存在します) を使用する場合は、いつでもイベント ハンドラーをバインドできます。<table>
- 唯一のコールバック (存在する場合)の前に実行される複数の
jqGridSelectRow
イベント ハンドラーを設定できます。イベント ハンドラーでいくつかの一般的なアクションを実装し、追加のイベント ハンドラーまたはコールバックを使用して特定のアクションをグリッドにすることができます。ファイナライズ アクションには、コールバックを使用できます。onSelectRow
jqGridSelectRow
jqGridSelectRow
onSelectRow
onSelectRow
対応するコードは次のようになります
$(function () {
var $grid = $("#list"),
editingRowId,
myInlineEditingOptions = {
keys: true,
oneditfunc: function (id) { editingRowId = id; },
afterrestorefunc: function () { editingRowId = undefined; },
aftersavefunc: function () { editingRowId = undefined; }
};
$grid.bind("jqGridSelectRow", function (e, id) {
if (id !== editingRowId) {
if (typeof editingRowId !== "undefined") {
// save previously editing row
//$(this).jqGrid("saveRow", editingRowId, myInlineEditingOptions);
// discard changes from the previously editing row
$(this).jqGrid("restoreRow", editingRowId, myInlineEditingOptions);
}
// start inline editing. The user should save the row by pressing ENTER
$(this).jqGrid("editRow", id, myInlineEditingOptions);
}
});
$grid.jqGrid({
datatype: 'local',
....
editurl: 'clientArray'
});
});
更新: イベントのバインド中に名前空間を使用できることを忘れていました。より複雑なシナリオでは非常に役立ちます。使用する場合は、または$grid.bind("jqGridSelectRow.myNamespace", ...);
を使用して独自のイベントのみをバインド解除できます。他の名前空間を持つ他のイベントのバインドは解除されません。$grid.unbind('.myNamespace');
$grid.unbind('jqGridSelectRow.myNamespace');