【问题标题】:Populate jqgrid with only selected xml data仅使用选定的 xml 数据填充 jqgrid
【发布时间】:2015-09-05 18:18:06
【问题描述】:

我有一个表单,它以 id 作为输入,并且基于 xml 文件中存在此 id,它必须使用来自同一 xml 文件的相关信息填充 jqgrid 表。请帮忙。我的 xml 代码看起来像

<EmpDetails>
  <Detail detailid="1">
    <empid>12345</empid>
    <Transaction transid="11">
      <date>09-01-2015</date>
      <type>Credit</type>
      <amount>15000</amount>
    </Transaction>
    <Transaction transid="12">
      <date>09-02-2015</date>
      <type>Debit</type>
      <amount>200</amount>
    </Transaction>
    <Transaction transid="13">
      <date>09-03-2015</date>
      <type>Debit</type>
    </Transaction>
  </Detail>
  <Detail detailid="2">
    <empid>67890</empid>
    <Transaction transid="21">
      <date>09-02-2015</date>
      <type>Debit</type>
      <amount>1200</amount>
    </Transaction>
   </Detail>
</EmpDetails> 

而javascript代码是

    $(document).ready(function () {

        $('#button1').click(function () {

            var textname = $('#name').val();
            var textempid = $('#empid').val();

            $.ajax({
                type: "GET",
                url: "DataScripts/Data1.xml",
                cache: false,
                dataType: "xml",
                success: function (xml) {
                    $(xml).find('Detail').each(function () {
                        var empid = $(this).find("empid").text();
                        var detailid = $(this).attr('detailid');

                        if (textempid==empid)
                        {
                            populategrid(detailid);
                        }

                    });
                }
            });

  function populategrid(detailid)
        {
           $('#GridTable').jqGrid({

                url: 'DataScripts/Data1.xml',
                datatype: "xml",
                colModel: [
                    {label: 'date', name: 'date', key: false, width: 75, xmlmap: 'date'},
                    {label: 'type', name: 'type', sortable: true, xmlmap: 'type'},
                    {label: 'amount', name: 'amount', sortable: true, xmlmap: 'amount'} 
                ],
                xmlReader: {
                    root: "EmpDetails",
                    row: "Detail>Transaction",
                    repeatitems: false,
                    id: "[detailid]"
                },
                width: 780,
                height: 250,
                rowNum: 5,
                pager: "#jqGridPager",
            }).navGrid('#jqGridPager', { edit: false, add: false, del: false }); 
           return;
      }

当我执行此操作时,我看到另一个 empid 的交易详细信息以及输入的 empid 的交易信息也显示在网格上。

提前致谢

【问题讨论】:

  • 您使用textname == name &amp;&amp; textempid==empid 搜索&lt;Detail&gt; 的特定"name""empid" 节点,但我没有看到任何name 节点(仅empid&lt;Detail&gt;。让我们你找到一些&lt;Detail&gt; 节点然后我不清楚你为什么不将节点转发到populategrid 以允许jqGrid 只读特定Transaction(找到)节点?您可以使用 jqGrid 的 datastr: detailNade, datatype: "xmlstring" 选项。如果信息对您来说还不够,那么我可以发布更多实施细节。
  • 谢谢@Oleg。请忽略 (textname==name)。我现在已经编辑了我的代码。我只用empid验证。您能否发布有关如何将详细节点转发到网格的更多详细信息。

标签: javascript jquery xml jqgrid


【解决方案1】:

有很多方法可以实现您的要求,但在我看来,最简单的方法是使用 xmlReader 并将 row 定义为函数。在函数内部,可以过滤&lt;Detail&gt; 元素以仅查找具有特定&lt;empid&gt; 子元素的元素。这种方式不需要使用额外的单独的$.ajax 调用。

The demo 显示以下结果

它使用以下代码

$("#GridTable").jqGrid({
    url: "samina.xml",
    datatype: "xml",
    colModel: [
        {name: "date", width: 75},
        {name: "type"},
        {name: "amount", formatter: "integer", sorttype: "integer"}
    ],
    xmlReader: {
        root: "EmpDetails",
        row: function (obj) {
            var empid = $("#empid").val(),
                // get Detail with specific empid element
                details = $(obj).children("Detail").filter(function () {
                    if ($(this).children("empid").text() === empid) {
                        return true;
                    }
                });
            return $(details).children("Transaction");
        },
        repeatitems: false,
        id: "[transid]"
    },
    width: 780,
    height: "auto",
    rowNum: 5,
    loadonce: true,
    gridview: true,
    autoencode: true,
    iconSet: "fontAwesome",
    pager: "#jqGridPager"
}).jqGrid("navGrid", "#jqGridPager", { edit: false, add: false, del: false, hideEmptyPagerParts: false });

上面最重要的是xmlReaderrowid部分,我改了。

【讨论】:

  • 非常感谢奥列格。它工作得很好。您能否在这里解释一下“rows = []”的意义。谢谢
  • @samina:不客气!您当然可以删除不需要的rows=[]。我想首先在rows 数组中推送具有特定empid 元素的&lt;Detail&gt; 元素,但后来决定改用jQuery.filter。我从答案中更新了代码。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多