我有一个从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)检查了触发重载事件时日期输入中的值是否正确传递。
为什么数据不更新的任何想法?可能是缓存或浏览器问题?
答案 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转发postData
到jQuery.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}
});