Jquery 是否应该将jqGrid的addJSONData用法替换为setGridParam()和trigger(';reloadGrid';)的用法?

Jquery 是否应该将jqGrid的addJSONData用法替换为setGridParam()和trigger(';reloadGrid';)的用法?,jquery,jqgrid,Jquery,Jqgrid,我最近写了一封对“问题”的答复。在写答案时,我想:为什么他使用addJSONData()函数来刷新网格中的数据,而不是更改setGridParam()的URL和刷新触发器('reloadGrid')的jqGrid数据?一开始我想推荐使用“重新加载网格”,但考虑到这一点,我明白我不太确定最好的方法是什么。至少,我不能用两句话解释为什么我喜欢第二种方式。所以我决定这可能是一个有趣的讨论主题 确切地说,我们有一个典型的情况。我们有一个网页,其中至少有一个jqGrid和一些其他控件,如组合框(选择)、复

我最近写了一封对“问题”的答复。在写答案时,我想:为什么他使用addJSONData()函数来刷新网格中的数据,而不是更改setGridParam()的URL和刷新触发器('reloadGrid')的jqGrid数据?一开始我想推荐使用“重新加载网格”,但考虑到这一点,我明白我不太确定最好的方法是什么。至少,我不能用两句话解释为什么我喜欢第二种方式。所以我决定这可能是一个有趣的讨论主题

确切地说,我们有一个典型的情况。我们有一个网页,其中至少有一个jqGrid和一些其他控件,如组合框(选择)、复选框等,这些控件允许用户更改jqGrid中显示的信息的范围。通常我们定义一些事件处理程序,比如
jQuery(#选择器”).change(myRefresh).keyup(mykeyresh)
我们需要根据用户的选择重新加载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选项相关的任何其他参数(请参阅)。通过定义serializeGridData()函数(jqGrid的另一个选项),可以在jqGrid发出相应的
    $.ajax
    请求之前立即修改所有构造的参数。不仅如此,还可以通过设置jqGrid的ajaxGridOptions选项来更改每个
    $.ajax
    参数。例如,我使用
    ajaxGridOptions:{contentType:“application/json”}
    作为
    $.jgrid.defaults
    的常规设置。 ajaxGridOptions选项非常强大。关于ajaxGridOptions选项,可以重新定义jqGrid发送的
    $.ajax
    请求的任何参数,如error、complete和beforeSend事件。我认为定义dataFilter事件来修改从服务器返回的行数据可能很有趣

    使用触发器('reloadGrid')方式的另一个理由是在AJAX请求处理期间阻塞jqGrid。在JSON请求发送到服务器期间,我通常使用参数
    loadui:'block'
    来阻止jqGrid。关于jQueryBlockUI插件,可以将网页的更多部分作为网格来阻止。要做到这一点,可以调用:

    jQuery('#main').block({ message: '<h1>Die Daten werden vom Server geladen...</h1>' });
    
    jQuery('#main').block({message:'Die Daten werden vom Server geladen…');
    
    在调用loadComplete和loadError函数中的触发器('reloadGrid')方法和jQuery('#main').unblock()之前。在这种情况下,loadui选项可以设置为“禁用”

    我的最后一句话是:我通常创建jqGrid,将数据类型设置为“local”,而不是“json”,我会调用一些控件(其中一个组合框)的触发器('change')函数,如下所示:
    jQuery(“#选择器”).change(myRefresh).keyup(mykeyresh.trigger('change')
    。 因此,我仅在更改句柄的一个位置构造jqGrid的url参数,并在上述setGridParam()中将datatype更改为“json”

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

    使用addJSONData()函数的人能给我解释一下使用它的好处吗


    公平地说,我可以添加addJSONData(),它存在于jqGrid的旧版本中,具有我在这里描述的大部分特性。是否应该将jqGrid的addJSONData替换为setGridParam()的用法,并触发('reloadGrid')?

    以下是我使用addJSONData()的原因

    在我的例子中,我有一个页面包含数据网格,另一个页面用于构建搜索条件

    搜索页面对网格页面一无所知,它包含七个字段。用户可以填写至少一个或全部七个字段

    提交时,搜索页面将数据格式化为发送到服务器的JSON对象中的键/值对

    在服务器上,JSON数据被解析为SQLWHERE子句

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

    据我所知,唯一的办法
     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);
        }
    
            jQuery("#areaSummaryTable").jqGrid('clearGridData');
            jQuery("#areaSummaryTable").jqGrid('setGridParam', {datatype:'json'});
            jQuery("#areaSummaryTable")[0].addJSONData(areaSummary);