【问题标题】:jqgrid not updating data on reloadjqgrid在重新加载时不更新数据
【发布时间】:2010-05-13 11:50:41
【问题描述】:

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

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

【问题讨论】:

    标签: jquery caching jqgrid


    【解决方案1】:

    在我看来你应该替换

    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 时计算一次。在带有函数 jqGrid 的 postData 中,将 postData 转发到 jQuery.ajax 并在每个 jQuery.ajax 期间(在 $("#list").trigger("reloadGrid"); 之后),将在调用 jQuery.ajax 时读取来自 datepicker 的值。

    【讨论】:

      【解决方案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 是唯一的,否则它将再次被缓存。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-09-11
          • 2011-11-07
          • 2015-04-03
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          相关资源
          最近更新 更多