应该将jqGrid的用法addJSONDatareplace为setGridParam()的用法,并触发('reloadGrid')?

我最近写了一个答案的问题“ jqGrid显示默认”加载“消息时更新表/自定义更新 ”。 在写回答的时候,我想:为什么他使用addJSONData()函数刷新网格中的数据,而不是相对于setGridParam()更改URL,并相对于触发器('reloadGrid')刷新jqGrid数据? 在开始的时候我想推荐使用'reloadGrid' ,但是在想到这个之后,我明白我不太清楚最好的方法是什么。 至less,我不能用两句话来解释为什么我更喜欢第二种方式。 所以我决定这可能是一个有趣的讨论主题。

所以确切的说:我们有一个典型的情况。 我们有一个网页,至less有一个jqGrid和一些其他的控件,如combobox(select),checkbox等,使用户可以更改jqGrid中显示的信息范围。 通常,我们定义一些事件处理程序,如jQuery("#selector").change(myRefresh).keyup(myKeyRefresh) ,我们需要根据用户的select重新加载jqGrid容器。

在阅读和分析来自其他用户input的信息之后,我们可以至less用两种方法刷新jqGrid容器:

  1. 调用$.ajax()手册,然后在成功或完成句柄的$.ajax调用jQuery.parseJSON() (或eval ),然后调用jqGrid的addJSONData函数。 我发现了很多使用addJSONData的 stackoverflow.com上的例子。
  2. 根据用户的input更新jqGrid的url ,将当前页码重置为1,并可以select更改网格的标题 。 所有这些都可以根据setGridParam()和可选的setCaption() jqGrid方法完成。 最后调用网格的触发器('reloadGrid')函数。 为了构造url ,我主要使用jQuery.param函数来确定,我已经把所有的url参数与encodeURIComponent进行了正确的压缩。

我希望我们讨论这两种方式的优缺点。 我现在使用第二种方式,所以我将从这个优点开始。

可以这样说:我调用现有的Web Service,将接收到的数据转换为jqGrid格式并调用addJSONData 。 这就是我使用addJSONData方法的原因!

好的,我会select另一种方式。 jqGrid可以直接在Web Service上调用并在网格中填充结果。 有很多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请求的任何参数,如errorcompletebeforeSend事件。 我发现定义dataFilter事件能够对从服务器返回的行数据进行任何修改是非常有趣的。

使用触发器('reloadGrid')的另一个方法是在AJAX请求处理期间阻塞jqGrid。 大多数情况下,我使用参数loadui: 'block'在JSON请求发送到服务器时阻止jqGrid。 就jQuery blockUI插件http://malsup.com/jquery/block/而言,可以将网页的更多部分作为网格来阻止。 要做到这一点,可以打电话给:

 jQuery('#main').block({ message: '<h1>Die Daten werden vom Server geladen...</h1>' }); 

在调用loadCompleteloadError函数内的触发器('reloadGrid')方法和jQuery('#main')。unblock() 之前 。 在这种情况下,可以将loadui选项设置为“禁用”。

我最后的评论:大多数情况下,我用创buildjqGrid的数据types设置为'local'而不是'json',我会调用一些控件(combobox之一触发器('change')函数,如: jQuery("#selector").change(myRefresh).keyup(myKeyRefresh).trigger('change') 。 因此,我只在变更句柄内部的一个地方构buildjqGrid的url参数,并在上述setGridParam()内部将数据types更改为'json'。

所以我不明白为什么应该使用函数addJSONData()

有谁可以使用addJSONData()函数向我解释它的用法的好处?

为了公平,我可以添加addJSONData() ,它存在于老版本的jqGrid中,因为它具有我在这里描述的大部分function。 应该将jqGrid的addJSONData的用法replace为setGridParam()的用法,并触发('reloadGrid')

我一直在用jqgrid使用addJSONData,但是1年前,jqGrid中很多东西都有改变。

无论如何,我需要在客户端重复和复杂的gui操作(银行分享的东西),我的Json数据仅在本地,并作为一些jkey点(作业完成)发送到服务器。 我有几个jqgrid(其中一些在其他人jqgrids :-))和某种本地浏览器的数据存储足够小,留在浏览器中,复杂和足够的移动,通过ajax IO在一个合理的时间内无法使用。

第一个版本是使用Ajax IO,当我被锁和等待问题,以及新的复杂的graphics用户界面事件的数量,我非常高兴地发现这个addJSONData挂钩,并有我自己的Ajax时间轴以外的jQgrid。

从服务器轻松构build网格/数据。 我使用JSON的一个主要原因是,它比XML小,并且在服务器(PHP)和客户端(JS)两方面都能很好地工作。 结果,我标准化(我知道几个做)之间的数据传输到JSON。

因此,addJSONData提供了一个简单的方法来不断更新网格中的所有数据,并一次显示。 它快速,快速,肮脏,它的工作原理。

不过就个人而言,长期来看,这将是一个糟糕的主意,大数据networking不断刷新。 在那里,更新到特定的单元格/列,在初始化后,有一个更好的主意,有2个电话。 将网格更改提交给服务器,并从服务器获取更改。

所以这样做的一个主要优点就是它的快速启动。 而当数据变得太大时,全部join选项只会在开始时降级一次。 虽然个人更新/获取可以添加,初始数据抓取后。

它是一个良好的工作周期:快速原型 – >有效的客户端 – 服务器数据网格

我正在使用addJSONData来提高页面上的性能。 这是我的用例

我在页面上有4个jqGrid。 数据检索方法对于所有4个网格是相同的,但是每个网格中的列和行是不同的。 因此,我不做4个服务器调用来填充每个网格中的数据,而是进行一次调用,为其他3个网格返回额外的JSON数据。 而在第一个网格的“loadComplete”事件中,我将其他3个网格中的每个网格的数据分开并单独加载它们。 这里是第一个网格的loadComplete事件的修剪版本

  loadComplete:function (data) { //clear and reload area summary table var areaSummary = data.areaSummary; jQuery("#areaSummaryTable").jqGrid('clearGridData'); jQuery("#areaSummaryTable")[0].addJSONData(areaSummary); //clear and reload area total table var areaTotal = data.areaTotal; jQuery("#areaTotalTable").jqGrid('clearGridData'); jQuery("#areaTotalTable")[0].addJSONData(areaTotal); //clear and reload area detail table jQuery("#detailedAreaTable").jqGrid('clearGridData'); var areaDetail = data.areaDetail; jQuery("#detailedAreaTable")[0].addJSONData(areaDetail); } 

这一直工作得很好,过去两周直到今天我注意到,在加载页面时,3个网格中的每一个都将服务器调用到随机URL。 原因是因为这些网格的数据types被定义为'json'。 如果我将数据types更改为“本地”,则不会从此网格调用服务器调用,但上面的代码中的addJSONData方法停止工作。 我尝试使用“setGridParam”更改数据types为“json”之前使用addJSONData像下面,但这也是行不通的。

  jQuery("#areaSummaryTable").jqGrid('clearGridData'); jQuery("#areaSummaryTable").jqGrid('setGridParam', {datatype:'json'}); jQuery("#areaSummaryTable")[0].addJSONData(areaSummary); 

我希望有一个简单的方法来将数据转换为数组,并使用addRowData :)让我知道是否有更好的方法来处理这种用例

这就是为什么我使用addJSONData()…

就我而言,我有一个包含数据网格的页面,以及另一个用于构buildsearch条件的页面。

对网格页面一无所知的search页面包含七个字段。 用户可以至less填写一个或全部七个字段。

提交后,search页面会将数据格式化为发送到服务器的JSON对象中的键/值对。

在服务器上,JSON数据被parsing成SQL WHERE子句。

SQL数据结果作为HTTP响应中的JSON对象发送回客户端,该响应也从服务器发送的代码构build网格页面。

据我所知,从HTTP响应中获取JSON数据到网格的唯一方法是使用addJSONData()。

克里斯

当你需要完全控制ajax发送的时间和方式时,你会更喜欢使用addJSONData

例如一个search表单包含两个<select>框,都是ajaxly填充的,第一个select的值会影响第二个。 用户可能已经为select框设置了默认值。 而且只有在定义了两个值后才想search网格。

那么更好的办法是使用$.Deferred来控制正在调用和填充的Ajax调用的顺序。 当然,你可以设置jqgrid数据为local然后json ,然后reloadGrid控制触发。 但是这不是那种琐事。

我使用addJSONData方法进行分页,如下所述。

在页面加载时,jqgrid加载由URL返回的JSON数据。 我们需要使用下一页function,但不必切换页面。 即最初,页面1加载了10条logging。 当我点击Nextbutton(NavButton),而不是在下一页加载下10条logging时,我希望所有20条logging都显示在页面1上。

在这里,第二个和后续的请求,我使用addJSONData方法。 我点击Nextbutton,然后使用addJSONData将json数据附加到现有的10条logging上。 我不能使用setGridParam,因为当我使用它时,最初的10条logging消失了,它只是在同一页面上加载下面的10条logging。

如果你有任何替代addJSONData这个特定的function,我会很高兴知道。 由于我面临的问题与子网扩展,filter工具栏等,当下一组logging使用addJSONData加载。