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 【问题描述】:我的网格有特殊的实现。
为此,我在 jqGrid 的 onSelectRow
和 loadComplete
方法中编写了一些代码。
在onSelectRow
中我需要更新一个全局数组,在loadComplete
方法中我必须访问全局数组并且需要在jqGrid 中进行一些操作。
直到那时我还好。我已经这样做了。 现在我想以一种通用的方式扩展这两种方法(其他网格可以使用它而无需编写任何代码)。
为此,我想到了以下步骤。
我想用 jqGrid.js 在我的 html 中添加一个新的 js(例如:jquery.jqGrid.additional.js)
我想通过jqGrid的数据数组来分配我的全局变量
在这个js中我要检查网格的多选值
1234563例如,我有 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
);
我对此做了很多尝试并花了很多时间。
【问题讨论】:
【参考方案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
)上触发两个事件jqGridLoadComplete
和jqGridAfterLoadComplete
。
所以基本上,你不能使用你的尝试。相反,我想到的唯一解决方案是使用相同的方法覆盖 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 方法调用如何通用?的主要内容,如果未能解决你的问题,请参考以下文章