是否可以将多个事件处理程序绑定到 JqGrid 事件而不覆盖以前的事件?

IT技术 javascript events jqgrid jquery
2021-02-21 13:01:30

例如,我在每次加载页面时调用我的默认设置,并将一个函数绑定到 loadComplete 来为我的网格做一些基本的格式化。

在某些页面上,我想同时执行其他逻辑,但是如果我在网格定义中设置 loadComplete,它将覆盖我的默认设置中设置的函数。

有没有办法绑定多个处理程序,或者其他一些执行所有必要代码的方法?提前致谢。

4个回答

我想你问的是当前版本的 jqGrid 中存在的一个重要问题。现在很难在 jqGrid 中实现更多作为一个事件处理程序对于使用 jqGrid 的小型项目,这个问题并不重要,但在您想要构建一些解释 jqGrid 的类的情况下可能很重要。您当前的解决方法没问题,但有您自己了解的限制。主要问题是您只能再实现一个额外的loadCompleteEx处理程序。

我建议您使用jQuery.trigger或更好的jQuery.triggerHandler您可以将它与jQuery.bindjQuery.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'loadCompletewill的第一次调用所以在第一次执行时将不会调用第二个事件处理程序。所以你最好在 jqGrid 定义之前绑定你的事件处理程序。在这种情况下,您可以确定该事件将始终被调用。loadCompletejqGridLoadComplete

更新: 重要!!!. 一个不需要触发jqGridLoadComplete事件明确里面的loadComplete,如果你使用的jqGrid的当前版本。jqGrid已经为你做这件事了以上代码是jqGrid的主要代码中包含相应功能之前编写的。答案只是描述了如何在 jqGrid 中实现多个事件处理程序的主要思想写完答案后,我向 trirand 发布了一些拉取请求,并建议在 jqGrid 中实现 jQuery 事件。从 4.3.2 版开始(参见此处),jqGrid 支持事件。

@IronicMuffin:可能有不同的小子问题和不同类型的用法。bind方法使用jQuery.datawithevents作为键。该值jqGridLoadComplete作为一个数组(参见此处)。如果您只是loadCompleteEx自己使用数组,则可以实现当前的解决方法,但您应该小心。在哪里分配数组?它是否可以作为一个网格使用更多,等等。我发现“触发”方式更灵活。
2021-04-25 13:01:30
一个可能更简单的解决方案是将我的响应与一系列函数一起使用,按顺序执行所有这些函数吗?我猜使用这些bind功能是更传统/更好的做法
2021-05-20 13:01:30

如果您想在请求之前做某事,请使用 beforeRequest 函数。

您还可以将函数绑定到 gridComplete 选项。你能给出一个代码示例来展示你想要做什么吗?

gridComplete 只触发一次,如果我有格式化我需要在每次加载时完成,那么这将不起作用。例如,如果网格为空,我会显示一条自定义消息。我必须在每次加载时检查它。现在,如果我想为空网格做额外的逻辑,我不能只添加到 loadComplete,因为它会覆盖。
2021-05-04 13:01:30

我的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()
},