Jquery jqgrid在重新加载时不更新数据

Jquery jqgrid在重新加载时不更新数据,jquery,caching,jqgrid,Jquery,Caching,Jqgrid,我有一个从xml流加载数据的jqgrid(由django 1.1.1处理): 以及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_

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

以及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)检查了在触发重新加载事件时日期输入中的值是否正确传递


你知道为什么数据没有更新吗?可能是缓存或浏览器问题?

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

在内部,jqGrid用于检索数据。您可以通过选项
ajaxGridOptions
指示jqGrid向ajax请求传递其他选项。因此,只要告诉它不要缓存结果,您就可以开始了:

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

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

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

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

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

在内部,jqGrid用于检索数据。您可以通过选项
ajaxGridOptions
指示jqGrid向ajax请求传递其他选项。因此,只要告诉它不要缓存结果,您就可以开始了:

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

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

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

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

在我看来,您应该更换

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

已更新
在当前解决方案中,
postData
的值在创建jqGrid时计算一次。在具有函数jqGrid forward
postData
jQuery.ajax
postData
中,以及在每次
jQuery.ajax
期间(在
$(“#列表”).trigger(“reloadGrid”);
之后),将在调用
jQuery.ajax
时读取来自日期选择器的值。

我觉得您应该替换它

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

已更新
在当前解决方案中,
postData
的值在创建jqGrid时计算一次。在
postData
中,使用函数jqGrid将
postData
转发到
jQuery.ajax
,并在每次
jQuery.ajax
(在
$(“#列表”).trigger(“重载网格”);
之后)来自datepicker的值将在调用
jQuery.ajax
时读取。

在发出新请求之前卸载网格似乎会破坏缓存。 在网格获取代码之前简单地使用GridUnload()方法

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


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

在提出新请求之前卸载网格似乎会破坏缓存。 在网格获取代码之前简单地使用GridUnload()方法

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


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