【发布时间】:2016-03-03 18:23:02
【问题描述】:
我正在使用自定义按钮将数据添加到网格中。如果网格中已经存在数据,则正确添加新行。但是如果网格是空的并且我添加了新行,它会给出 Uncaught TypeError: t.p.data.push is not a function error at jqgrid source file。用于添加新行的代码如下
var rows = $("#" + gridName).getDataIDs();
$("#" + gridName).jqGrid("addRowData", rows.length + 1, {
Id: rows.length + 1},'first');
$("#" + gridName).editRow(rows.length + 1, true);
我正在使用自定义导航栏来添加和编辑网格。
网格是使用以下代码创建的 createJqGrid:function(gridId, columns, gridData){
$("#"+gridId).jqGrid({
datatype: 'local',
data: gridData,
editurl: 'clientArray',
colModel: columns,
loadonce: false,
//width: '100%',
autowidth: true,
shrinkToFit:false,
height: 250,
rownumbers: false,
multiselect: true,
cellEdit: true,
toppager: true,
cloneToTop: true,
rowNum: 10000,
pager: "#pager"+gridId,
cellsubmit: 'clientArray',
ondblClickRow: function(rowid, iRow, iCol) {
//$("#save" + gridId).removeClass("ui-state-disabled");
},
beforeSelectRow: function(rowid, e) {
return true;
},
beforeCellSelect: function(rowid, e) {
return true;
},
afterEditCell: function(rowid, cellName, cellValue, iRow, iCol) {
var cellDOM = this.rows[iRow].cells[iCol];
$(cellDOM).removeClass("ui-state-highlight");
$("#save" + gridId).removeClass("ui-state-disabled");
},
onCellSelect: function(rowid, celname, value, iRow, iCol) {
//$("#save" + gridId).removeClass("ui-state-disabled");
return true;
},
loadComplete: function() {
}
});
$("#"+gridId).navGrid("#pager"+gridId, {
cloneToTop: true,
edit: false,
search: false,
add: false,
del: false,
refresh: false,
view: false
});
网格创建后,基于一些调用,我更新了网格的 gridData。
工具栏添加使用
grid.jqGrid('navButtonAdd', '#' + grid[0].id + '_toppager_left', { // "#list_toppager_left"
caption: "",
title: "Add",
id: 'add' + gridName,
onClickButton: function() {
// perform something...
var rows = $("#" + gridName).getDataIDs();
$("#" + gridName).jqGrid("addRowData", rows.length + 1, {
Id: rows.length + 1
},'first');
$("#" + gridName).editRow(rows.length + 1, true);
// Call this whenever Save button needs to be Enabled
$("#save" + gridName).removeClass("ui-state-disabled");
}
});
当网格有一些数据时,addRowData 可以工作,但是当网格为空时,它会报错
if(t.p.datatype === 'local') {
lcdata[t.p.localReader.id] = id;
t.p._index[id] = t.p.data.length;
t.p.data.push(lcdata); // Error comes on this line
lcdata = {};
}
【问题讨论】:
-
你应该总是写下你使用哪个版本的 jqGrid 以及哪个 fork(free jqGrid、Guriddo jqGrid JS 或版本 gridData 分配
data。哪个值有gridData“当网格为空时”?它应该是空数组[]而不是undefined或null。 -
此外,使用
var rows = $("#" + gridName).getDataIDs();$("#" + gridName).jqGrid("addRowData", rows.length + 1, {..},'first');...填充网格很糟糕,特别是如果您在循环中执行此操作并用许多行填充网格。无论如何,如果行可以被删除而不仅仅是插入,那么rows.length + 1的使用是不好的选择。我建议您改用$.jgrid.randId()函数,它可以生成用作rowid 的唯一值。 -
谢谢奥列格。错误是数据不是空数组。修复该问题更正了问题。我还修复了代码,我没有使用 randId 而不是 rows.length。
-
如果您将评论移至答案,我将接受它作为我问题的解决方案
-
不客气!我很高兴能帮助你。我发布了包含相同信息的简短答案,我之前发布了评论。