2015-12-14 39 views
4

我有一個XML數據源像下面,如何從一個單元格的自定義格式訪問其他行數據的jqGrid中

<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 

誰能告訴我的步驟來實現這一目標。

更新:我有jqGrid的版本4.4.0託尼Tomov的。由於我正在開發一個已開發的應用程序,因此我無法更改或更新該庫版本。所以我必須使用相同的JqGrid版本4.4.0。

好像Oleg的rowObject instanceof Element ? $(rowObject).attr("priceOri") : rowObject.priceOri正在爲這一要求。

更新2:(因爲rowObject.rewards在下面的情況下不會工作)

新的XML具有低於改變格式,
<項priceOri = 「100」 折扣= 「10」 獎勵= 「20」> < /項目>

因此新格式將像,

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 
} 

請注意,我不顯示VAL在jQgrid表中,輸入rewards。那麼我怎麼能做到這一點。

奧列格的回答是: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

在有數據的處理custom formatter內的一個重要問題。 rowObject的格式與輸入數據項相同。因此,必須使用rowObject[0]rowObject.priceOri來處理JSON數據,取決於是否使用repeatitems: false。以相同的方式,自定義格式化程序的代碼應該是另一個來處理JSON數據,該數據使用下一個節點或屬性。一個必須使用$(rowObject).find(">priceOri")$(rowObject).attr("priceOri")(最後一個對應於您的數據的格式)。

事件更復雜的(對於理解)必須是代碼若用loadonce: true另外。僅在處理從服務器加載的數據期間,必須使用上述中的表達式。下一個處理(在本地排序,尋呼或過濾之後)必須使用rowObject.priceOri表示法。

我開發free jqGrid叉的jqGrid託尼後短的已經改變的jqGrid的許可協議(見the post),取得了產品的商業(見the prices),並已重命名的jqGrid爲「Guriddo jqGrid的JS」。自從開發免費jqGrid大約一年後,我實現了許多功能(其中最多的功能在the wiki和每個發佈版本的自述文件中都有描述)。

免費jqGrid擁有rowObject參數的格式與之前版本保持兼容,但參數option已擴展。它包含rowData財產與解析數據。要在自由jqGrid中訪問自定義格式化程序內部的priceOri,可以使用options.rowData.priceOri。因此,你可以在使用loadonce: true的情況下使用

function discountFmatter (cellvalue, options, rowObject) { 
    return parseFloat(options.rowData.priceOri) - 
      parseFloat(options.rowData.discount); 
} 

格式化作品的代碼以同樣的方式,它會留下來,即使工作如果你想從返回的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" 
    }); 
}); 
+0

這是一個驚人的答案@Oleg。但是我擁有Tony Tomov的JQgrid版本4.4.0。並且它不包含'options'參數的'rowData'屬性。但它有'getRowData()'方法。但不能像你提到的那樣使用它。所以問題仍然存在。 – prime

+0

而'$(rowObject).attr(「priceOri」)'只能在第一次使用。如上所述,篩選後它將被評估爲'undefined'。 – prime

+0

@prime:我不建議你使用2012年中發佈的復古版本4.4.0。如果仍然無法更新,那麼你可以使用'rowObject instanceof Element? $(rowObject).attr(「priceOri」):rowObject.priceOri' – Oleg

相關問題