所以,准确来说:我们有一个典型的情况。我们有一个网页,至少有一个jqGrid和一些其他控件,如组合框(选择),复选框等,让用户可能改变显示在jqGrid信息的范围。通常我们定义一些事件处理程序,如jQuery(“#selector”)。change(myRefresh).keyup(myKeyRefresh)
并且我们需要根据用户的选择重新加载jqGrid容器。
在读取和分析来自附加用户输入的信息之后,我们可以以至少两种方式刷新jqGrid容器:
>调用$ .ajax()手册,然后在$ .ajax的成功或完整句柄调用jQuery.parseJSON()(或eval),然后调用jqGrid的addJSONData函数。我在stackoverflow.com上发现了很多使用addJSONData的例子。
>根据用户输入更新jqGrid的URL,将当前页数重置为1,并可选择更改网格的标题。所有这些都可以根据setGridParam()和可选的setCaption()jqGrid方法来完成。最后调用网格的触发器(‘reloadGrid’)函数。要构造的url,我通常使用jQuery.param函数的方式来确保,我有所有的url参数打包正确的encodeURIComponent。
我想让我们讨论这两种方式的优点和缺点。我目前使用第二种方式,所以我将从这个优点开始。
可以说:我调用现有的Web服务,将接收到的数据转换为jqGrid格式并调用addJSONData。这就是为什么我使用addJSONData方法!
好的,我会选择另一种方式。 jqGrid可以直接在Web服务上调用并在网格内填充结果。有很多jqGrid选项,它允许您自定义此过程。
首先,可以删除或重命名相对于jqGrid的prmNames选项发送到服务器的任何标准参数,或者添加关于postData选项的任何其他参数(见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options)。可以在jqGrid通过定义serializeGridData()函数(jqGrid的另一个选项)做出相应的$ .ajax请求之前立即修改所有构造的参数。除此之外,可以通过设置jqGrid的ajaxGridOptions选项来更改每个$ .ajax参数。我使用ajaxGridOptions:{contentType:“application / json”}例如作为$ .jgrid.defaults的一般设置。
ajaxGridOptions选项非常强大。对于ajaxGridOptions选项,可以重新定义通过jqGrid发送的$ .ajax请求的任何参数,如error,complete和beforeSend事件。我看到可能有趣的是定义dataFilter事件,以便能够对从服务器返回的行数据进行任何修改。
使用触发器(‘reloadGrid’)方式的另一个参数是在AJAX请求处理期间阻塞jqGrid。大多数情况下,我使用参数loadui:’block’阻止jqGrid在JSON请求发送到服务器。相对于jQuery blockUI插件http://malsup.com/jquery/block/,可以阻止网页的更多部分作为网格。要做到这一点,可以调用:
jQuery('#main').block({ message: '<h1>Die Daten werden vom Server geladen...</h1>' });
在调用loadComplete和loadError函数内的触发器(‘reloadGrid’)方法和jQuery(‘#main’)。unblock()之前。在这种情况下,loadui选项可以设置为“disable”。
我的最后一句话:主要是我用于创建jqGrid数据类型设置为’local’而不是’json’,我会调用一些控件(组合框)的触发器(‘change’)函数,如:
jQuery(“#selector”)。change(myRefresh).keyup(myKeyRefresh).trigger(‘change’)。
因此,我只在更改句柄内部的一个位置构造jqGrid的url参数,并在上述setGridParam()内将数据类型更改为“json”。
所以我不明白为什么函数addJSONData()应该被使用。
有人可以使用addJSONData()函数向我解释其使用的优点吗?
公平地说,我可以添加addJSONData(),它存在于旧版本的jqGrid中,因为它具有我在这里描述的大部分功能。应该将jqGrid的addJSONData的用法替换为setGridParam()和trigger(‘reloadGrid’)的用法吗?
解决方法
无论如何,我需要沉重,复杂的gui操作在客户端(银行共享的东西),我的Json数据是本地的,并作为一些jkey点(作业完成)发送到服务器。我有几个jqgrid(其中一些内部的其他jqgrids :-))和某种本地浏览器存储的数据,足够小,留在浏览器和复杂,移动足以在一个合理的时间通过ajax IO不可用。
第一个版本使用Ajax IO,当我遇到锁和等待问题,并通过新的复杂的GUI的东西来了,我真的很高兴找到这个addJSONData钩子,并在jQgrid外面有我自己的ajax时间线。