未捕获类型错误:无法读取未定义的属性"formatter"。
我添加grid.locale-en.js
和jqgrid-min.js
的顺序是正确的。
准确地说,错误在一行:
var h = a.p.colModel[e]; if (h.formatter !== void 0)
在jqgrid-min.js
中,e是colmodel名称(注意这是一个整数)。
这是我设置单元格的方式。
$("#GoingCostLogGrid").jqGrid('setCell', rowId, Costs_ProjectOrProgram , cellValue_CurrentTotalforAllFY);
其中Costs_ProjectOrProgram是一个整数,也是colmodel中的列名。
如果使用数字(如12
)作为参数或使用包含数字的字符串(如"12"
)调用setCell
,则存在大差异。number参数将被解释为colModel
数组中的索引,但字符串值将被解释为由列名。
因此,如果Costs_ProjectOrProgram
的类型是数字,并且您想将其解释为字符串,那么您应该将变量转换为字符串。所以你应该使用
$("#GoingCostLogGrid").jqGrid('setCell', rowId, String(Costs_ProjectOrProgram),
cellValue_CurrentTotalforAllFY);
而不是
$("#GoingCostLogGrid").jqGrid('setCell', rowId, Costs_ProjectOrProgram,
cellValue_CurrentTotalforAllFY);
顺便说一下,使用第一个大写字母的变量是非常糟糕的。与JavaScript的名称转换相对应,应该仅对构造函数(类的构造函数)使用这样的名称。这样可以很容易地了解如何使用标识符。例如,您需要使用var d = new Date(2015, 3, 24);
而不是var d = Date(2015, 3, 24);
,即使在上面使用Date
的情况下,您在许多web浏览器中可能会得到相同的结果。您可以看到,即使是JavaScript代码的格式化程序也会用另一种颜色显示具有第一个大写字符的identity,以强调它作为标准变量具有另一种含义(例如cellValue_CurrentTotalforAllFY
)。我强烈建议您保留您使用的语言中存在的名称转换。
更新:jqGrid执行以下操作:在setCell
代码的开头,它尝试使用isNaN(colname)
将列名参数转换为数字。如果列名是数字或包含数字的字符串,则它将被解释为列的索引(请参见行)。因此,为了解决这个问题,必须使用setCell
、getCell
、getCol
和许多其他方法,并使用列的索引而不是名称。所以你必须做以下
var colModel = $("#GoingCostLogGrid").jqGrid("getGridParam", "colModel"),
iCol, nCol = colModel.length;
for (iCol = 0; iCol < nCol; iCol++) {
if (colModel[iCol].name === Costs_ProjectOrProgram) {
$("#GoingCostLogGrid").jqGrid("setCell", rowId, iCol,
cellValue_CurrentTotalforAllFY);
}
}
如果有很多地方需要这样做,那么可以将按列名搜索列索引放在函数中,并在需要时调用If。
如果您要使用免费的jqGrid而不是jqGrid 4.6,那么即使在使用datatype: "local"
的情况下也可以使用jsonmap
。有关详细信息,请参阅wiki文章。通过这种方式,您可以将列定义为{name: "c5", jsonmap: "5"}
,而不是使用{name: "5"}
,从而出现上述问题。或者,您可以更改输入数据,使输入数据的属性以字母开头。