Ответ 1
Вы можете использовать простой:
jQuery("#list")
.jqGrid('setGridParam',
{
datatype: 'local',
data:mydata
})
.trigger("reloadGrid");
Я пытаюсь использовать jqGrid с локальными данными, и я нахожу пару проблем:
Я инициализирую следующее:
function refreshGrid($grid, results)
{
$grid.jqGrid({
data: results,
datatype: "local",
colNames:['#','File', 'Category', 'Line Number', 'Message Text','Detailed'],
colModel:[
{name:'count',index:'count', width:100, resizable: true},
{name:'basename',index:'basename', width:100, resizable: true, classes:['basename']},
{name:'category',index:'category', width:60, resizable: true},
{name:'linenumber',index:'linenumber', width:60, resizable: true},
{name:'text',index:'text',width:400, resizable: true},
{name:'detailed',index:'detailed',width:100,classes:['detailed'], resizable: true }
],
viewrecords: true,
rowNum:100,
rowList:[100,200],
pager: '#debug_errors_pager',
caption:"JSON Example"
});
}
Данные, которые я передаю, results
- это массив объектов.
Вопросы:
1) Пейджер полностью выключен. Он показывает правильный счет, но на самом деле он не позволяет мне просматривать данные.
2) Я не могу обновить данные. Я использую свою собственную функцию поиска, чтобы добраться до моего results
. Я не могу понять, как обновить существующие данные. Сетка инициализируется в первый раз. При последующих попытках он инициализирует пустую таблицу.
3) Я пробовал такие вещи, как:
$grid.empty()
- Не работает, потому что объект $grid украшен jqgrid. Я пытаюсь "уничтожить" старую сетку и просто переделать ее как обходной путь.
`$ grid.trigger('reloadGrid') - не работает, не знаю почему.
Примечание: это использование jQGrid 3.7.
Вы можете использовать простой:
jQuery("#list")
.jqGrid('setGridParam',
{
datatype: 'local',
data:mydata
})
.trigger("reloadGrid");
Я смог добиться чего-то подобного. Трюк для моей проблемы состоял в том, чтобы очистить данные перед обновлением параметра сетки данных. Предположим, что ваша сетка инициализирована в другом месте (с типом данных: "local" ), попробуйте:
function refreshGrid($grid, results) {
$grid.jqGrid('clearGridData')
.jqGrid('setGridParam', { data: results })
.trigger('reloadGrid', [{ page: 1}]);
}
вопрос 1:
Если мы определили пейджер для сетки с данными на стороне клиента, кнопки в пейджере автоматически отключены. Другими словами, текущий выпуск сетки не поддерживать пейджинг и поиск на стороне клиента.
Вопрос 2: Вы пробовали:
$("#list").GridUnload();
см. здесь для различий между gridUnload()
и trigger('reloadGrid')
.
Я не нашел хороший документированный способ обновления локальных данных jqGrid, вот как я расширил jqGrid, чтобы решить мою проблему:
$.extend($.fn.jqGrid, { setData: function(data) {
this[0].p.data = data;
return true;
} } );
После этого вы можете сделать следующее, чтобы обновить jqGrid новыми данными:
предположим, что ваша сетка была объявлена следующим образом:
jQuery("#list").jqGrid({ datatype: "local", ... other params ... });
то вы можете сделать:
jQuery("#list").jqGrid('setData', array_with_new_data);
jQuery("#list").trigger("reloadGrid");
P.S. см. ссылку о том, как извлечь все данные из сетки Извлечение содержимого сетки
Следующее работает для меня при обновлении данных по существующей сетке:
var gridData = [...];
var grid = jQuery('#gridId');
grid.jqGrid('clearGridData');
if( grid.get(0).p.treeGrid ) {
grid.get(0).addJSONData({
total: 1,
page: 1,
records: gridData.length,
rows: gridData
});
}
else {
grid.jqGrid('setGridParam', {
datatype: 'local',
data: gridData,
rowNum: gridData.length
});
}
grid.trigger('reloadGrid');
Мне пришлось делать это так, потому что reloadGrid() вызывает populate(), populate() вызывает addLocalData() и передает возвращаемое значение в addJSONData(), но для treeGrid == true addLocalData() ничего не возвращает и addJSONData() впоследствии ничего не делает.