jqgrid没有更新重载数据

我有一个jqgrid从xml流加载数据(由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元素:

 Start Date:  End Date:   

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

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

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

在我看来你应该更换

 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;} }, 

更新 :在您当前的解决方案中,在创建jqGrid时,会计算一次postData的值。 在postData ,函数jqGrid将postData转发到jQuery.ajax并在每个jQuery.ajax期间(在$("#list").trigger("reloadGrid"); )来自$("#list").trigger("reloadGrid");的值将在jQuery.ajax读取呼叫。

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

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

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

或者:

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

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

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

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

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