jqgrid не обновляет данные при перезагрузке - PullRequest
1 голос
/ 13 мая 2010

У меня есть 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:

<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 протестирован, чтобы вернуть разные данные для разных временных отметок.

Я проверил с помощью оповещения (document.getElementById ('datepicker_start'). Value), что значения во входных данных даты правильно передаются при запуске события перезагрузки.

Есть идеи, почему данные не обновляются? Возможно, проблема с кэшированием или браузером?

Ответы [ 3 ]

3 голосов
/ 13 мая 2010

Мне кажется, вам стоит заменить

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");) значения из указателя даты будут считываться в момент вызова jQuery.ajax.

2 голосов
/ 07 декабря 2011

Выгрузка сетки перед новым запросом, кажется, разрушает кэш для меня. Просто используйте метод GridUnload () перед кодом извлечения сетки.

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


jQuery("#list").jqGrid({
    ...
    ajaxGridOptions: {cache: false}
});
2 голосов
/ 13 мая 2010

Похоже, проблема кэширования браузера. По умолчанию IE будет кэшировать результаты запроса GET. Таким образом, даже если вы делаете один и тот же запрос несколько раз из одного и того же экземпляра браузера, если для одного и того же URL-адреса он всегда будет использовать кэшированную версию (IE, данные из первого запроса).

Внутренне, jqGrid использует jQuery.ajax для извлечения данных. Вы можете указать jqGrid передавать дополнительные параметры в запрос ajax с помощью параметра ajaxGridOptions. Так что просто скажите это, чтобы не кэшировать результаты, и вы должны хорошо идти:

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

В качестве альтернативы:

Если первый подход не работает с django из-за создания URL-адреса GET (поскольку jQuery будет использовать конструкцию ?), другой возможный вариант - полностью перезагрузить сетку. Для этого:

  • Звоните GridUnload, чтобы разгрузить сетку,
  • Затем снова вызовите .jqGrid, чтобы заново инициализировать всю сетку
  • Вам также необходимо добавить метку времени к опции url, чтобы гарантировать уникальность URL-адреса, в противном случае он просто будет снова кэширован.

Очевидно, что это не очень хорошее решение, но оно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...