如何从JqGrid中的单元格自定义格式化程序访问其他行数据

时间:2015-12-14 13:18:26

标签: jquery jqgrid

我有一个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

1 个答案:

答案 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的最新代码并显示

enter image description here

它使用以下代码

$(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"
    });
});