我自己不使用 Zend 框架。所以我的建议很常见,它们独立于您使用的框架。
在下面的示例中,我将展示如何在网格上动态设置onSelectRow 以实现对行选择的内联编辑。我想网格中已经存在其他必需的设置,例如 colModel 和 editurl 选项的 editable: true 属性。所以我只动态显示onSelectRow的设置。
第一种方法是使用setGridParam 设置onSelectRow 回调。对应的demo使用如下代码:
$(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);
}
}
});
});
在上述场景中,重要的是要提及
- 我们可以设置(或更改)
onSelectRow在创建 jqGrid 之后。
- 在网格中可以只有一个
onSelectRow回调。设置新的onSelectRow 回调覆盖现有的。
最后一个限制可能非常严格。例如,您不能实现一些默认的onSelectRow 操作,这些操作应该对项目中的所有网格执行,而对一些其他 特定操作使用额外的onSelectRow。这是引入类 jQuery 事件的主要原因,这些事件可以非常接近回调的形式使用。下一个示例演示了该技术。
The next demo 的工作方式与前一个完全相同,但它使用jqGridSelectRow 事件而不是onSelectRow 回调。新技术有两个重要的优点
- 可以设置
jqGridSelectRow 事件处理程序在 jqGrid 创建之前或之后。如果您使用jQuery.bind 绑定事件处理程序,那么将被转换为网格的<table> 元素应该存在。如果使用更慢一点的jQuery.delegate、jQuery.live 或jQuery.on(最后一个从 jQuery 1.7 开始存在)可以绑定
事件处理程序。
-
一个可以设置多个
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'); 仅取消绑定自己的事件。它不会取消绑定具有其他命名空间的其他事件。