1

我的网格有特殊的实现。
为此,我在jqGridonSelectRowloadComplete方法中编写了一些代码。

onSelectRow我需要更新一个全局数组并且在loadComplete方法中我必须访问全局数组并且需要在 jqGrid 中进行一些操作。

到那时我还好。我已经这样做了。现在我想以一种通用的方式扩展这两种方法(其他网格可以使用它而无需编写任何代码)。

为此,我想到了以下步骤。

  1. 我想用 jqGrid.js 在我的 html 中添加一个新的 js(例如:jquery.jqGrid.additional.js)

  2. 我想通过 jqGrid 的数据数组来分配我的全局变量

  3. 在这个js中,我想检查网格的多选值

  4. 如果该值为 true,那么我想扩展 onSelectRow、loadComplete 方法,以使 jqGrid 执行我的方法和在 onSelectRow、loadComplete 方法中编写的代码。

例如,我有preLoadComplete并且postLoadComplete需要在方法执行之前和之后loadComplete 执行。同样,这也适用于 onSelectRow 方法。

我在 jquery.jqGrid.additional.js 中编写了以下代码,然后在 jqGrid 加载后没有收到警报(1),警报(2)。

它只执行 jqGrid 的 loadComplete 方法中编写的代码。

var oldLoadComplete = $.fn.jqGrid.loadComplete;

$.jqGrid.extend({
   loadComplete: function (){
      var ret;
      // do someting before
      alert(1);

      ret = oldLoadComplete.call (this);

      // do something after
      alert(3);

      return ret; // return original or modified results
   }
});

我对此进行了很多尝试并花了很多时间。

4

1 回答 1

1

您正在尝试扩展$.jqGrid,而不是$.fn.jqGrid。在第一行中,这意味着它$.jqGrid甚至不存在,并且所有元素都无法访问您修改过的.jqGrid插件,但仍然是默认值。

尽管我尝试$.fn使用“新”附加方法进行扩展,但不起作用。您可能必须显式覆盖这些方法。我可以想象 jQuery 有一些自身的安全例程和$.extend方法中内置的插件。

var oldLoadComplete = $.fn.jqGrid.loadComplete;

$.fn.jqGrid.loadComplete = function( ) {
    alert('pre');
    var ret = oldLoadComplete.apply(this, arguments); // In case any arguments will be provided in future.
    alert('post');
    return ret;
};

编辑:

忘记这一切。这是无关紧要的。在 GitHub 上查看 jqGrid 的源代码后,很明显 jqGrid 甚至没有使用$.fn.jqGrid.loadComplete. 那是你自己编造的。相反,它会创建另一个对象,该对象提供可能的属性和默认值列表,然后被自定义默认值覆盖,最后被您调用 jqGrid 时传入的函数参数覆盖。

我发现 jqGrid分别在调用 loadComplete 回调之前和之后触发了两个事件jqGridLoadCompletejqGridAfterLoadComplete在您的匹配元素集(即)上触发。this

所以基本上,你不能使用你的尝试。相反,我想到的唯一解决方案是$.fn.jqGrid使用相同的方法覆盖 jqGrid “构造函数”(即)并应用监听器来this喜欢这样:

var oldJqGrid = $.fn.jqGrid;

$.fn.jqGrid = function( ) {
    this.on('jqGridLoadComplete', function( jqEvt ) {
            alert('Pre');
        })
        .on('jqGridAfterLoadComplete', function( jqEvt ) {
            alert('Post');
        });
    return oldJqGrid.apply(this, arguments);
};

关于您的多选...我不知道您在说什么。我自己的时间非常有限,现在不得不拒绝进一步的协助。

真挚地。

于 2012-08-11T23:51:30.973 回答