views:

627

answers:

1

I am using jqgrid.My page has three tabs and each tab contains a different grid.All grids have different ids.The content of tabs is fetched via AJAX request lazily.Now after all three grids are rendered and i try to reload grid via function

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

Only the grid which loaded last reloads and it doesn't work for other grids.

eg if grids load seq is : 1-2-3 then this code will only work for grid 3 but if seq is 3-2-1 then it will work only for 1.

But if i try reloading grids using reload button on navigator bar it works fine.

Any help would be appreciated.

Thanks Arun

More Info

I am using Struts2 jQuery Plugin.It uses jqGrid 3.6.4 I load json data using ajax.

Below is the definition of my grid.

I have three such grids all have different ids and all that stuff.

There is a search button above each grid which calls the following function with parameter sel.sel is 1,2 or 3 corresponding to each grid

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');                 
}

}

The function gets called for each grid but

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

works for only grid loaded last.

A: 

First of all in your code you define variables myTradeOfferGame and acceptedTradeOfferGame (inside of else if(sel==2) and else if(sel==3)), but use myTradeOffer and acceptedTradeOffer. It looks like errors.

Second: The urls inside of else if(sel==2) and else if(sel==3) look another as in the first table: URLs are static, so why one should set this value every time? Probably you want to add in all urls the part with $("#srchoptions").val()? You should fix these problem yourself.

In your code one can see, that you use $.ajaxSetup which change global settings of $.ajax. If you change this 3 times only the last one will be saved. If only one from three setting work at one refresh, $.ajaxSetup is nevertheless not the best way. jqGrid has parameter ajaxGridOptions, which set parameters of $.ajax per table (see http://stackoverflow.com/questions/2675625/setting-the-content-type-of-requests-performed-by-jquery-jqgrid/2678731#2678731).

Moreover jqGrid (every instance) has a parameter postData, which will be forward to $.ajax as data parameter. So you can use this parameter in the jqGrid definition. If you want that the data which you place as postData will be reloaded during every trigger('reloadGrid') you can just define postData using function. The default behavior of $.ajax is to test whether the field of data parameter is function, it it is so, $.ajax call this function the get the value. So your code could look like following:

// 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 //...
// ...

By the way if you use HTTP GET for data request, the parameters from data parameter (postData) will be just appended to the url (with placing '?' and '&' like one do this usual).

The final code can be something like following:

// 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(); } },
    //...
});

and

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
Thanks for your suggestions and effort Oleg.But it doesn't solve my problem.Above recommendations do make the code elegant but the problem still remains the same.Below is the code snippet jQuery("#acceptedtable").jqGrid('setGridParam',{url:"offers.action?q=1",page:1}); jQuery("#acceptedtable").trigger('reloadGrid'); Here i am setting the url and then triggering reload event.No matter what ajaxSettings were the grid should reload but it doesn't.Probably there is something else going on like a new grid overwriting previous grids handler or something like that.
arun chaudhary
And even after those AjaxSetup setting the reload button on navigator works fine it just the trigger('reloadGrid') thats not working.Any idea if i can trigger the same event which navigator search button triggers.
arun chaudhary
Use fiddler (see https://www.fiddler2.com/fiddler2/version.asp) to verify whether your request are send (replace localhost in urls to ipv4.fiddler during the tests). What you write sound like a cashing problem. If it is so, there are different ways for workaround. Just delete local cash before a refreshing of data. If the data will be refreshed after emptying of cash, I can post you references how to fix the problem (for example `cache` parameter of jQuery.ajax function).
Oleg