【问题标题】:Is it possible to bind multiple event handlers to JqGrid events without overwriting previous ones?是否可以将多个事件处理程序绑定到 JqGrid 事件而不覆盖以前的事件?
【发布时间】:2011-10-10 05:45:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript events jqgrid jquery


    【解决方案1】:

    有一个比我在其他任何地方看到的更简单的解决方案:

    // Set defaults
    jQuery.extend(jQuery.jgrid.defaults, {
        loadComplete: function () {
            myCustomFunction();
        }
    });
    
    loadComplete: function() {
        // someOtherFunction();
        $.jgrid.defaults.loadComplete(); // Runs myCustomFunction()
    },
    

    【讨论】:

      【解决方案2】:

      我想你问的是当前版本的 jqGrid 中存在的一个重要问题。现在很难在 jqGrid 中实现更多的event handler。对于使用 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 中使用您所知道(以及您需要的)关于标准事件的所有内容。

      参见相应的演示here。尝试切换网格中的页面或更改排序以调用loadComplete

      我在 jqGrid 定义之后绑定第二个jqGridLoadComplete 。因为我的演示使用datatype:'local',所以loadComplete 的第一次调用将在绑定执行之前。所以在第一个loadComplete 执行将是第二个jqGridLoadComplete 未调用事件处理程序。所以你最好在 jqGrid 定义之前绑定你的事件处理程序。在这种情况下,您可以确定该事件将始终被调用。

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

      【讨论】:

      • 可能更简单的解决方案是将我的响应与一组函数一起使用,按顺序执行所有这些函数吗?我猜使用bind 函数是更传统/更好的做法。
      • @IronicMuffin:可能有不同的小子问题和不同类型的用法。 bind 方法使用 jQuery.dataevents 作为键。该值具有jqGridLoadComplete 作为数组(请参阅here)。如果您自己使用loadCompleteEx 作为数组,您可以实施当前的解决方法,但您应该小心。在哪里分配数组?它会与更多的网格一起使用吗?等等。我发现“触发器”方式更灵活。
      【解决方案3】:

      我的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
      };
      

      像魅力一样工作......这里有什么不好的做法吗?

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • gridComplete 只触发一次,如果我在每次加载时都需要进行格式化,那么这将不起作用。例如,如果网格为空,我会显示一条自定义消息。我必须在每次负载时检查它。现在,如果我想为一个空网格做额外的逻辑,我不能只添加到 loadComplete,因为它会覆盖。
        猜你喜欢
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2017-06-07
        • 2016-10-08
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多