【问题标题】:Reload Grid not working for multiple jqgrid重新加载网格不适用于多个 jqgrid
【发布时间】:2011-02-19 23:11:43
【问题描述】:

我正在使用 jqgrid。我的页面有三个选项卡,每个选项卡包含一个不同的网格。所有网格都有不同的 id。选项卡的内容是通过 AJAX 请求延迟获取的。现在在渲染所有三个网格之后,我尝试通过函数重新加载网格

jQuery("#myOffersTable").trigger('reloadGrid'); 

只有上次加载的网格会重新加载,其他网格不起作用。

例如,如果 grids load seq 为 : 1-2-3 那么此代码仅适用于 grid 3 但如果 seq 是 3-2-1 那么它只适用于 1。

但是如果我尝试使用导航栏上的重新加载按钮重新加载网格,它工作正常。

更新:

我正在使用 Struts2 jQuery 插件。它使用 jqGrid 3.6.4 我使用 ajax 加载 json 数据。

以下是我的网格的定义。

<div id='t1'>
    <s:url id="offersurl" action="offers"/>
     
    <sjg:grid 
        id="offerstable" 
        caption="Customer Examples"
        autoencode="false" 
        dataType="json" 
        href="%{offersurl}"         
        
        pager="true"       
        navigator="true"
        navigatorAdd="false"
        navigatorDelete="false"
        navigatorEdit="false"
        navigatorSearch="false"
                
        gridModel="offers"
        rowList="10,15,20"
        rowNum="15"
        rownumbers="true"
        onCompleteTopics="addAcceptButtons"
        filter="true"
    >
        <sjg:gridColumn name="id" index="id" title="ID" formatter="integer" sortable="false" search="false"/>
        <sjg:gridColumn name="offeror" index="offeror" title="Offeror" sortable="true" search="false"/>
        <sjg:gridColumn name="itemOffered" index="itemOffered" title="ItemOffered" sortable="false" search="true" searchoptions="{sopt:['eq']}"/>
        <sjg:gridColumn name="quantityOffered" index="quantityOffered" title="QuantityOffered" sortable="false" search="true" searchoptions="{sopt:['eq','lt','gt']}"/>
        <sjg:gridColumn name="expectedItem" index="expectedItem" title="ExpectedItem" sortable="false" search="true" searchoptions="{sopt:['eq']}"/>
        <sjg:gridColumn name="expectedQuantity" index="expectedQuantity" title="ExpectedQuantity" sortable="false" search="true" searchoptions="{sopt:['eq','lt','gt']}"/>
        <sjg:gridColumn name="acceptOffer" index="acceptOffer"  title="Accept Offer" search="false"/>
    </sjg:grid>    
    
</div>

我有三个这样的网格都有不同的 id 和所有这些东西。

每个网格上方都有一个搜索按钮,它调用以下函数,参数sel.sel为每个网格对应的1,2或3

function search(sel)
{   
    alert("search");
    if(sel==1)
    {       
        tradeOffer = $("#games").val();
        var srchValue = $("#srchoptions").val();
            $.ajaxSetup({
                data: {'gameId': tradeOffer},             
            });
        jQuery("#offerstable").jqGrid('setGridParam',{url:"offers.action?q=1&srch="+srchValue,page:1});
        //jQuery("#offerstable").trigger('reloadGrid');
        $("#offerstable").trigger("reloadGrid");
    }
    else if(sel==2)
    {           
            myTradeOfferGame = $("#my").val();          
                $.ajaxSetup({
                    data: {'gameId': myTradeOffer},               
                });
            jQuery("#myOffersTable").jqGrid('setGridParam',{url:"offers.action?q=1",page:1});
            jQuery("#myOffersTable").trigger('reloadGrid');                 
    }
    else if(sel==3)
    {           
            acceptedTradeOfferGame = $("#accepted").val();          
                $.ajaxSetup({
                    data: {'gameId': acceptedTradeOffer},             
                });
            jQuery("#acceptedtable").jqGrid('setGridParam',{url:"offers.action?q=1",page:1});
            jQuery("#acceptedtable").trigger('reloadGrid');                 
    }
    
}

每个网格都会调用该函数,但是

jQuery("#acceptedtable").trigger('reloadGrid'); 

仅适用于最后加载的网格。

【问题讨论】:

  • 您使用哪个版本的 jqGrid?您如何将数据加载到网格中(ajax、xml、本地)?您能否发布一个有问题的小代码示例。提示:jqGrid 从服务器接收的数据(xml/json)可以保存在文件中,而不是加载动态数据,可以加载具有相同结果的静态文件。如果可以重现该问题,也可以找到解决方案或变通方法。
  • 嗨,奥列格,请查看编辑后的帖子。

标签: jquery jqgrid struts2 grid


【解决方案1】:

首先在您的代码中定义变量myTradeOfferGameacceptedTradeOfferGame(在else if(sel==2)else if(sel==3) 内部),但使用myTradeOfferacceptedTradeOffer。看起来像错误。

第二个:else if(sel==2)else if(sel==3) 内部的 url 看起来和第一个表中的不同:URL 是静态的,为什么每次都要设置这个值呢?可能您想在所有网址中添加$("#srchoptions").val() 的部分?您应该自己解决这些问题。

在您的代码中可以看到,您使用了$.ajaxSetup,它更改了$.ajax 的全局设置。如果您更改此 3 次,则只会保存最后一个。如果一次刷新只能使用三种设置中的一种,$.ajaxSetup 仍然不是最好的方法。 jqGrid有参数ajaxGridOptions,每个表设置$.ajax的参数(见Setting the content-type of requests performed by jQuery jqGrid)。

此外,jqGrid(每个实例)都有一个参数postData,它将作为data参数转发到$.ajax。所以你可以在 jqGrid 定义中使用这个参数。如果您希望您作为postData 放置的数据将在每个 trigger('reloadGrid') 期间重新加载,您可以使用函数定义postData$.ajax 的默认行为是测试data 参数的字段是否为函数,是这样的,$.ajax 调用此函数获取值。因此您的代码可能如下所示:

// definition of 3 jqGrids
jQuery("#offerstable").jqGrid ({
    postData: {'gameId': function() { return $("#games").val(); } },
    //...
});
jQuery("#myOffersTable").jqGrid ({
    postData: {'gameId': function() { return $("#my").val(); } },
    //...
});
jQuery("#myOffersTable").jqGrid ({
    postData: {'gameId': function() { return $("#accepted").val(); } },
    //...
});

if(sel==1)
{       
    jQuery("#offerstable")
    .jqGrid('setGridParam',
            {url:"offers.action?q=1&srch="+encodeURIComponent($("#srchoptions").val()),
            page:1})
    .trigger('reloadGrid');
} else //...
// ...

顺便说一句,如果您使用 HTTP GET 进行数据请求,来自 data 参数 (postData) 的参数将只是 附加 到 url(放置 '?' 和 '& ' 就像平时那样做)。

最终的代码可能如下所示:

// definition of 3 jqGrids
jQuery("#offerstable").jqGrid ({
    url:"offers.action", 
    postData: {'q': 1,
               'gameId': function() { return $("#games").val(); },
               'srch': function() { return $("#srchoptions").val(); },
    //...
});
jQuery("#myOffersTable").jqGrid ({
    url:"offers.action", 
    postData: {'q': 1,
               'gameId': function() { return $("#my").val(); } },
    //...
});
jQuery("#myOffersTable").jqGrid ({
    url:"offers.action", 
    postData: {'q': 1,
               'gameId': function() { return $("#accepted").val(); } },
    //...
});

if(sel==1) {
    jQuery("#offerstable").jqGrid('setGridParam',{page:1}).trigger('reloadGrid');
} else if (sel==2) {
    jQuery("#myOffersTable").jqGrid('setGridParam',{page:1}).trigger('reloadGrid');
} else if (sel==3) {
    jQuery("#acceptedtable").jqGrid('setGridParam',{page:1}).trigger('reloadGrid');
}

【讨论】:

  • 感谢您的建议和努力 Oleg。但这并不能解决我的问题。以上建议确实使代码优雅,但问题仍然存在。下面是代码 sn -p jQuery("#acceptedtable").jqGrid('setGridParam',{url:"offers.action?q=1",page:1}); jQuery("#acceptedtable").trigger('reloadGrid');在这里,我正在设置 url,然后触发重新加载事件。无论 ajaxSettings 是什么网格应该重新加载但它没有。可能还有其他事情发生,比如一个新的网格覆盖以前的网格处理程序或类似的东西。
  • 即使在那些 AjaxSetup 设置导航器上的重新加载按钮工作正常之后,它只是触发器('reloadGrid')不起作用。知道我是否可以触发导航器搜索按钮触发的相同事件。
  • 使用 fiddler(参见fiddler2.com/fiddler2/version.asp)来验证您的请求是否已发送(在测试期间将 url 中的 localhost 替换为 ipv4.fiddler)。你写的听起来像是一个兑现问题。如果是这样,则有不同的解决方法。只需在刷新数据之前删除本地现金。如果在清空现金后数据会刷新,我可以给你发布如何解决问题的参考(例如cache jQuery.ajax 函数的参数)。
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多