例如,我在每次加载页面时调用我的默认设置,并将一个函数绑定到 loadComplete 来为我的网格做一些基本的格式化。
在某些页面上,我想同时执行其他逻辑,但是如果我在网格定义中设置 loadComplete,它将覆盖我的默认设置中设置的函数。
有没有办法绑定多个处理程序,或者其他一些执行所有必要代码的方法?提前致谢。
例如,我在每次加载页面时调用我的默认设置,并将一个函数绑定到 loadComplete 来为我的网格做一些基本的格式化。
在某些页面上,我想同时执行其他逻辑,但是如果我在网格定义中设置 loadComplete,它将覆盖我的默认设置中设置的函数。
有没有办法绑定多个处理程序,或者其他一些执行所有必要代码的方法?提前致谢。
我想你问的是当前版本的 jqGrid 中存在的一个重要问题。现在很难在 jqGrid 中实现更多作为一个事件处理程序。对于使用 jqGrid 的小型项目,这个问题并不重要,但在您想要构建一些解释 jqGrid 的类的情况下可能很重要。您当前的解决方法没问题,但有您自己了解的限制。主要问题是您只能再实现一个额外的loadCompleteEx
处理程序。
我建议您使用jQuery.trigger或更好的jQuery.triggerHandler。您可以将它与jQuery.bind和jQuery.unbind一起使用。通过这种方式,您可以定义任意数量的事件处理程序,它们的工作方式类似于标准 jQuery 事件。
例如,
var grid = $("#list");
grid.bind('jqGridLoadComplete',function(e,data) {
alert ("in first jqGridLoadComplete event handler. Called for the page " +
data.page);
});
grid.jqGrid({
// jqGrid parameters
// ...
loadComplete: function(data) {
alert("main load complete");
$(this).triggerHandler("jqGridLoadComplete", data);
}
});
grid.bind('jqGridLoadComplete.jqGrid',function(e,data) {
alert ("in second jqGridLoadComplete event handler. Called for the page " +
data.page);
});
在第二个中,jQuery.bind
我使用了命名空间“jqGrid”中的命名空间事件“jqGridLoadComplete.jqGrid”。因此,您可以在 jQuery 中使用您所知道的(以及您需要的)关于标准事件的所有内容。
在此处查看相应的演示。尝试切换网格中的页面或更改排序以调用loadComplete
.
我在 jqGrid 定义jqGridLoadComplete
之后绑定第二个。因为我的演示在绑定执行之前使用datatype:'local'
了loadComplete
will的第一次调用。所以在第一次执行时将不会调用第二个事件处理程序。所以你最好在 jqGrid 定义之前绑定你的事件处理程序。在这种情况下,您可以确定该事件将始终被调用。loadComplete
jqGridLoadComplete
更新: 重要!!!. 一个不需要触发jqGridLoadComplete
事件明确里面的loadComplete
,如果你使用的jqGrid的当前版本。jqGrid已经为你做这件事了。以上代码是在jqGrid的主要代码中包含相应功能之前编写的。答案只是描述了如何在 jqGrid 中实现多个事件处理程序的主要思想。写完答案后,我向 trirand 发布了一些拉取请求,并建议在 jqGrid 中实现 jQuery 事件。从 4.3.2 版开始(参见此处),jqGrid 支持事件。
如果您想在请求之前做某事,请使用 beforeRequest 函数。
您还可以将函数绑定到 gridComplete 选项。你能给出一个代码示例来展示你想要做什么吗?
我的hackaround解决方案:
// Global Variable in my common.js
var loadCompleteEx;
// set defaults
$.extend($.jgrid.defaults, {
datatype: 'json',
height: "100%",
...
loadComplete: function () {
if ($("#grid").getGridParam("reccount") === 0)
$("#empty-grid-message").show();
else
$("#empty-grid-message").hide();
// if loadCompleteEx is defined, call it at the end of loadComplete
if (loadCompleteEx)
loadCompleteEx();
}
}
// In my specific page js
loadCompleteEx = function () {
// Do more stuff after load completes
};
很有魅力……这里有什么不好的做法吗?
有一个比我在其他任何地方看到的推荐的更简单的解决方案:
// Set defaults
jQuery.extend(jQuery.jgrid.defaults, {
loadComplete: function () {
myCustomFunction();
}
});
loadComplete: function() {
// someOtherFunction();
$.jgrid.defaults.loadComplete(); // Runs myCustomFunction()
},