我有一个XML
数据源,如下所示,
<root>
<item priceOri = "100" discount = "10"></item>
<item priceOri = "200" discount = "110"></item>
.
.
.
</root>
我正在使用JqGrid将这些数据填充到表中。 代码如下所示。
datatype : 'xml',
colModel: [
...
{name:'priceOri', index:'priceOri', width:60,xmlmap : "[priceOri]", align:"center"},
{name:'discount', index:'discount', width:60,xmlmap : "[discount]", align:"center"},
{name:'price', index:'price', width:60,xmlmap : "[price]", align:"center", editable: true, formatter:discountFmatter},
...
]
xmlReader: {
root: "root",
row: "item",
repeatitems: false
},
格式化程序如下所示。
function discountFmatter (cellvalue, options, rowObject)
{
var price;
// do calculation based on other cell values in the same column
//price = priceOri - discount;
var new_format_value = price;
return new_format_value
}
在代码中,我需要访问item
标记中的其他值来计算price
部分。所以基本上我想访问同一行中的其他单元格值。我怎么能这样做。
我使用了以下代码段,但结果为undefined
rowObject[0] // undefined
rowObject.priceOri //undefined
任何人都可以告诉我实现这一目标的步骤。
更新:我有Tony Tomov的 JqGrid版本4.4.0 。由于我正在开发已经开发的应用程序,因此我无法更改或更新该库版本。所以我必须使用相同的JqGrid版本4.4.0。
似乎Oleg&#39; s rowObject instanceof Element ? $(rowObject).attr("priceOri") : rowObject.priceOri
正在为此要求而努力。
更新2:(因为rowObject.rewards
不适用于以下情况)
新XML的格式如下,
&LT; item priceOri =&#34; 100&#34;折扣=&#34; 10&#34;奖励=&#34; 20&#34; &GT;&LT; / item&gt;
所以新的格式化程序就像,
function discountFmatter (cellvalue, options, rowObject)
{
var price;
// do calculation based on other cell values in the same column
//price = priceOri - discount - rewards;
var new_format_value = price;
return new_format_value
}
请注意,我不会在jQgrid表中显示值rewards
。那么我怎样才能实现这一点。
Oleg的回答:In case of usage old jqGrid you will have to add new column rewards. You can use hidden: true property in the column. Free jqGrid allow you to use additionalProperties
答案 0 :(得分:1)
在custom formatter内部处理数据时存在一个重要问题。 rowObject
的格式与输入数据项相同。因此,必须使用rowObject[0]
或rowObject.priceOri
来处理JSON数据,具体取决于是否使用repeatitems: false
。同样,自定义格式化程序的代码应该是另一个处理JSON数据的代码,它使用下一个节点或属性。必须使用$(rowObject).find(">priceOri")
或$(rowObject).attr("priceOri")
(最后一个对应数据格式)。
如果另外使用loadonce: true
,事件更复杂(理解)必须是代码。只有在处理从服务器加载的数据期间,才必须使用上述中的表达式。下一个处理(在本地排序,分页或过滤之后)必须使用rowObject.priceOri
表示法。
在Tony更改了jqGrid的许可协议(参见free jqGrid)之后,我开发了jqGrid的the post分叉,使产品商业化(参见the prices)并将jqGrid重命名为“ Guriddo jqGrid JS“。由于免费jqGrid开发了大约一年,我实现了许多功能(the wiki中描述的最多,并且每个发布版本都有自述文件)。
Free jqGrid保持rowObject
参数的格式与以前相同,以保持与先前版本的兼容性,但参数option
已扩展。它包含带有已解析数据的rowData
属性。要在免费的jqGrid中访问自定义格式化程序内的priceOri
,可以使用options.rowData.priceOri
。因此你可以使用
function discountFmatter (cellvalue, options, rowObject) {
return parseFloat(options.rowData.priceOri) -
parseFloat(options.rowData.discount);
}
格式化程序的代码在使用loadonce: true
的情况下以相同的方式工作,即使您将返回的数据格式从XML更改为JSON,它也将继续工作(例如,以提高代码的性能) )。
The demo使用来自GitHub的免费jqGrid的最新代码并显示
它使用以下代码
$(function () {
"use strict";
function discountFmatter (cellvalue, options, rowObject) {
return parseFloat(options.rowData.priceOri) -
parseFloat(options.rowData.discount);
}
$("#grid").jqGrid({
url: "prime.xml",
datatype: "xml",
colModel: [
{ name: "priceOri", xmlmap: "[priceOri]" },
{ name: "discount", xmlmap: "[discount]" },
{ name: "price", xmlmap: "[price]", editable: true,
formatter: discountFmatter }
],
cmTemplate: { width: 60, align: "center" },
iconSet: "fontAwesome",
xmlReader: {
root: "root",
row: "item",
repeatitems: false
},
loadonce: true,
viewrecords: true,
rownumbers: true,
caption: "Stack Overflow Example"
});
});