jqgrid没有更新重载数据

时间:2010-05-13 11:50:41

标签: jquery caching jqgrid

我有一个从xml流加载数据的jqgrid(由django 1.1.1处理):

jQuery(document).ready(function(){
  jQuery("#list").jqGrid({
    url:'/downtime/list_xml/',
    datatype: 'xml',
    mtype: 'GET',
    postData:{site:1,date_start:document.getElementById('datepicker_start').value,date_end:document.getElementById('datepicker_end').value},
    colNames:[...],
    colModel :[...],
    pager: '#pager',
    rowNum: 25,
    rowList:[10,25,50],
    viewrecords: true,
    height: 500,
    caption: 'Click on column headers to reorder'
  });

    $("#grid_reload").click(function(){
        $("#list").trigger("reloadGrid");
        }); 
    $("#tabs").tabs();

    $("#datepicker_start").datepicker({dateFormat: 'yy-mm-dd'});
    $("#datepicker_end").datepicker({dateFormat: 'yy-mm-dd'});
...

和html元素:

<th>Start Date:</th>
<td><input id="datepicker_start" type="text" value="2009-12-01"></input></td>
<th>End Date:</th>
<td><input id="datepicker_end" type="text" value="2009-12-03"></input></td>
<td><input id="grid_reload"  type="submit" value="load" /></td>

当我单击grid_reload按钮时,网格会重新加载,但是当它完成后,它会显示与之前完全相同的数据,即使测试了xml以返回不同时间戳的不同数据。

我已经使用alert(document.getElementById('datepicker_start')。value)检查了触发重载事件时日期输入中的值是否正确传递。

为什么数据不更新的任何想法?可能是缓存或浏览器问题?

3 个答案:

答案 0 :(得分:3)

在我看来,你应该替换

postData:{
    site:1,
    date_start:document.getElementById('datepicker_start').value,
    date_end:document.getElementById('datepicker_end').value
},

postData:{
    site:1,
    date_start: function() { return document.getElementById('datepicker_start').value; },
    date_end: function() { return document.getElementById('datepicker_end').value;}
},

<强>已更新: 在您当前的解决方案中,postData的值在您创建jqGrid时计算一次。在postData功能jqGrid转发postDatajQuery.ajax以及每个jQuery.ajax期间($("#list").trigger("reloadGrid");之后),datepicker中的值将在jQuery.ajax时读取{1}}致电。

答案 1 :(得分:2)

它看起来像是一个浏览器缓存问题。默认情况下,IE将缓存GET请求的结果。因此,即使您从同一个浏览器实例多次发出相同的请求,如果是同一个URL,它也将始终使用缓存版本(IE,来自第一个请求的数据)。

在内部,jqGrid使用jQuery.ajax来检索数据。您可以通过选项ajaxGridOptions指示jqGrid将其他选项传递给ajax请求。所以告诉它不要缓存结果,你应该好好去:

jQuery("#list").jqGrid({
    ...
    ajaxGridOptions: {cache: false}
});

可替换地:

如果第一种方法由于构造GET URL而无法使用django(因为jQuery将使用?构造),另一种可能的选择是完全重新加载网格。为此:

  • 致电GridUnload以卸载网格,
  • 然后再次致电.jqGrid以重新初始化整个网格
  • 您还需要在url选项后附加一个时间戳,以保证该URL是唯一的,否则它将再次被缓存。

显然,这不是一个很好的解决方案,但它会起作用。

答案 2 :(得分:2)

在发出新请求之前卸载网格似乎让我失去了缓存。 在网格获取代码之前简单地使用GridUnload()方法。

$("#list").GridUnload();


jQuery("#list").jqGrid({
    ...
    ajaxGridOptions: {cache: false}
});