jqGrid 的 loadComplete 和 onSelectRow 的 pre 和 post 方法调用如何通用?

Posted

技术标签:

【中文标题】jqGrid 的 loadComplete 和 onSelectRow 的 pre 和 post 方法调用如何通用?【英文标题】:How to do pre and post method call of loadComplete and onSelectRow of jqGrid genecally? 【发布时间】:2012-08-08 18:00:55 【问题描述】:

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

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

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

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

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

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

    在这个js中我要检查网格的多选值

    1234563

例如,我有 preLoadCompletepostLoadComplete 需要在 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
   
);

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

【问题讨论】:

【参考方案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 回调之前和之后分别在您的匹配元素集(即this)上触发两个事件jqGridLoadCompletejqGridAfterLoadComplete

所以基本上,你不能使用你的尝试。相反,我想到的唯一解决方案是使用相同的方法覆盖 jqGrid“构造函数”(即$.fn.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);
;

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

真诚的。

【讨论】:

您好,Derija,感谢您的回复。根据您的建议,我在 jquery.jqGrid.additional.js 中添加了上述代码。我的 jqGrid 如下所示, $("#appAndContextTable").jqGrid( datastr: jsonString, ........, loadComplete: function () alert('Need to implement'); );当我加载网格时,我收到了用 loadComplete 方法编写的警报。我没有收到前后警报。请帮助我如何获得预先、发布警报。另外,如何在我自己定义的 loadComplete 方法中获取属性 multiselect 的值? @user1591670 只是关于我的帖子更新的通知。您可能想阅读它。另外,我建议在发布另一个问题之前浏览一下您尝试扩展的项目的源代码。有很大帮助。 ;) 弄清楚这些关于 jqGrid 的东西花了我大约 10 分钟。 感谢 Derija 的帮助。我的问题解决了。你真的帮了我很多。我还找到了获取 jqGrid 不同属性值的方法。再次感谢。 嗨 Derija,有一件事我刚刚注意到我编写了 jqGrid 代码,例如 $("#appAndContextTable").jqGrid( datastr: jsonString, ........, loadComplete: function () alert('需要实现'); ).jqGrid('navGrid','#appAndContextTablePager',cloneToTop:true, edit: false, add: false, del: false, search: true);然后,如果我按照您在另一个 js 中的建议添加上述代码,则会收到错误“jqGrid - 没有这样的方法:navGrid”。即使 onSelectRow 也会给出相同的错误。如果我添加代码,一旦网格加载完成,基本上所有其他与网格绑定的事件都不起作用。请帮帮我!!!

以上是关于jqGrid 的 loadComplete 和 onSelectRow 的 pre 和 post 方法调用如何通用?的主要内容,如果未能解决你的问题,请参考以下文章

jqGrid设置符合条件的行选中

如何在jQGrid行中禁用超链接

jqgrid学习

Jqgride关于获取完数据可直接编辑

如何在网格内容加载时隐藏jqgrid标头?

footerdata 如何设置 jqgrid 设置动态列