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

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

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

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

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

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

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

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

  4. 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
   }
});

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

【问题讨论】:

    标签: javascript jquery jquery-plugins jqgrid extend


    【解决方案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 也会给出相同的错误。如果我添加代码,一旦网格加载完成,基本上所有其他与网格绑定的事件都不起作用。请帮帮我!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多