2011-07-26 38 views
28

我正在使用addJsonRows方法将本地数据添加到jQgrid。由于这种方法禁用排序我需要另一种解决方案。一个限制:我无法设置url并从服务器获取数据,因为数据是通过另一个组件传递的。在没有AddJsonRows的情况下在jQgrid中加载本地JSON数据

下面的代码片断启发案件。注释行显示了限制,我通过定义一个局部变量来替代它以具有测试用例。

<script type="text/javascript" language="javascript"> 
    function loadPackageGrid() { 
    // Get package grid data from hidden input. 
    // var data = eval("("+$("#qsmId").find(".qsm-data-packages").first().val()+")"); 
     var data = { 
      "page": "1", 
      "records": "2", 
      "rows": [ 
       { "id": "83123a", "PackageCode": "83123a" }, 
       { "id": "83566a", "PackageCode": "83566a" } 
      ] 
     }; 

     $("#packages")[0].addJSONData(data); 
    }; 

    $(document).ready(function() { 
     $("#packages").jqGrid({ 
      colModel: [ 
       { name: 'PackageCode', index: 'PackageCode', width: "110" }, 
       { name: 'Name', index: 'Name', width: "300" } 
      ], 
      pager: $('#packagePager'), 
      datatype: "local", 
      rowNum: 10000, 
      viewrecords: true, 
      caption: "Packages", 
      height: 150, 
      pgbuttons: false, 
      loadonce: true 
     }); 
    }); 
</script> 

我想知道如何以其他(更好)的方式做到这一点,以保持排序功能。 我试了一下数据选项,没有结果。

回答

40

我想对于其他人来说同样的问题很有意思。所以对于这个问题,我需要+1。

您可以至少以两种方式解决问题。第一个可以使用datatype: "jsonstring"datastr: data。在这种情况下,您需要添加附加参数jsonReader: { repeatitems: false }

第二种方法是使用datatype: "local"data: data.rows。如果将使用localReader来读取data.rows阵列中的数据。默认的localReader可以读取数据。

相应的演示是herehere

我修改了一些你的数据:填入“名称”列,并在输入数据中包含第三项。

现在您可以使用本地分页,排序和过滤/搜索数据。我包含了更多的代码来演示这些功能。下面你从演示找到一个的代码:

$(document).ready(function() { 
    'use strict'; 
    var data = { 
      "page": "1", 
      "records": "3", 
      "rows": [ 
       { "id": "83123a", Name: "Name 1", "PackageCode": "83123a" }, 
       { "id": "83432a", Name: "Name 3", "PackageCode": "83432a" }, 
       { "id": "83566a", Name: "Name 2", "PackageCode": "83566a" } 
      ] 
     }, 
     grid = $("#packages"); 

    grid.jqGrid({ 
     colModel: [ 
      { name: 'PackageCode', index: 'PackageCode', width: "110" }, 
      { name: 'Name', index: 'Name', width: "300" } 
     ], 
     pager: '#packagePager', 
     datatype: "jsonstring", 
     datastr: data, 
     jsonReader: { repeatitems: false }, 
     rowNum: 2, 
     viewrecords: true, 
     caption: "Packages", 
     height: "auto", 
     ignoreCase: true 
    }); 
    grid.jqGrid('navGrid', '#packagePager', 
     { add: false, edit: false, del: false }, {}, {}, {}, 
     { multipleSearch: true, multipleGroup: true }); 
    grid.jqGrid('filterToolbar', { defaultSearch: 'cn', stringResult: true }); 
}); 

修订:我决定增加约datatype: "jsonstring"datatype: "local"场景之间差异的详细细节,因为旧的答案被读取,被许多读者投票选出。

我建议稍微修改上面的代码以便更好地展示差异。拳头代码使用datatype: "jsonstring"

$(function() { 
    "use strict"; 
    var data = [ 
      { id: "10", Name: "Name 1", PackageCode: "83123a", other: "x", subobject: { x: "a", y: "b", z: [1, 2, 3]} }, 
      { id: "20", Name: "Name 3", PackageCode: "83432a", other: "y", subobject: { x: "c", y: "d", z: [4, 5, 6]} }, 
      { id: "30", Name: "Name 2", PackageCode: "83566a", other: "z", subobject: { x: "e", y: "f", z: [7, 8, 9]} } 
     ], 
     $grid = $("#packages"); 

    $grid.jqGrid({ 
     data: data, 
     datatype: "local", 
     colModel: [ 
      { name: "PackageCode", width: 110 }, 
      { name: "Name", width: 300 } 
     ], 
     pager: "#packagePager", 
     rowNum: 2, 
     rowList: [1, 2, 10], 
     viewrecords: true, 
     rownumbers: true, 
     caption: "Packages", 
     height: "auto", 
     sortname: "Name", 
     autoencode: true, 
     gridview: true, 
     ignoreCase: true, 
     onSelectRow: function (rowid) { 
      var rowData = $(this).jqGrid("getLocalRow", rowid), str = "", p; 
      for (p in rowData) { 
       if (rowData.hasOwnProperty(p)) { 
        str += "propery \"" + p + "\" + have the value \"" + rowData[p] + "\n"; 
       } 
      } 
      alert("all properties of selected row having id=\"" + rowid + "\":\n\n" + str); 
     } 
    }); 
    $grid.jqGrid("navGrid", "#packagePager", 
     { add: false, edit: false, del: false }, {}, {}, {}, 
     { multipleSearch: true, multipleGroup: true }); 
    $grid.jqGrid("filterToolbar", { defaultSearch: "cn", stringResult: true }); 
}); 

它显示(见the demo

enter image description here

人们可以看到以相同的顺序等的输入数据未排序项目。输入数据项将保存在内部参数data_index中。 getLocalRowonSelectRow中使用的方法显示内部data的项目仅包含输入项目的属性,其名称对应于某些jqGrid列的name属性。此外不需要_id_属性将被添加。

在另一侧the next demo其使用datatype: "local"显示排序数据和所有属性包容复杂对象将仍保存在内部data

enter image description here

在最后演示中使用的代码包含如下:

$(function() { 
    "use strict"; 
    var data = [ 
      { id: "10", Name: "Name 1", PackageCode: "83123a", other: "x", subobject: { x: "a", y: "b", z: [1, 2, 3]} }, 
      { id: "20", Name: "Name 3", PackageCode: "83432a", other: "y", subobject: { x: "c", y: "d", z: [4, 5, 6]} }, 
      { id: "30", Name: "Name 2", PackageCode: "83566a", other: "z", subobject: { x: "e", y: "f", z: [7, 8, 9]} } 
     ], 
     $grid = $("#packages"); 

    $grid.jqGrid({ 
     data: data, 
     datatype: "local", 
     colModel: [ 
      { name: "PackageCode", width: 110 }, 
      { name: "Name", width: 300 } 
     ], 
     pager: "#packagePager", 
     rowNum: 2, 
     rowList: [1, 2, 10], 
     viewrecords: true, 
     rownumbers: true, 
     caption: "Packages", 
     height: "auto", 
     sortname: "Name", 
     autoencode: true, 
     gridview: true, 
     ignoreCase: true, 
     onSelectRow: function (rowid) { 
      var rowData = $(this).jqGrid("getLocalRow", rowid), str = "", p; 
      for (p in rowData) { 
       if (rowData.hasOwnProperty(p)) { 
        str += "propery \"" + p + "\" + have the value \"" + rowData[p] + "\"\n"; 
       } 
      } 
      alert("all properties of selected row having id=\"" + rowid + "\":\n\n" + str); 
     } 
    }); 
    $grid.jqGrid("navGrid", "#packagePager", 
     { add: false, edit: false, del: false }, {}, {}, {}, 
     { multipleSearch: true, multipleGroup: true }); 
    $grid.jqGrid("filterToolbar", { defaultSearch: "cn", stringResult: true }); 
}); 

所以我会建议使用datatype: "local"代替datatype: "jsonstring"datatype: "jsonstring"只有在一些非常特定的情况下才有一些优势。

+0

的回答再次非常感谢!我注意到demolinks是相同的。然而,我没有第二个演示就管理它,也许这对其他人很有用。 – Brecht

+1

@Brecht:不客气!我修复了第二个链接,谢谢! – Oleg

+0

可怕的答案,thanx以@Brecht为好问题。 – sanghavi7

-1

伟大的建议,奥列格。

在我的web应用程序,我预先加载它看起来像这样一些JSON数据:

{ 
     WorkflowRuns: 
     [ 
      { 
       WorkflowRunID: 1000, 
       WorkflowRunName: "First record", 
      }, 
      { 
       WorkflowRunID: 1001, 
       WorkflowRunName: "Second record", 
      } 
     ], 
     UserInformation: 
     { 
      Forename: "Mike", 
      Surname: "Gledhill" 
     } 
} 

这里是我需要创建的jqGrid的代码,只需在此基础上JSON的WorkflowRuns部分:

var JSONstring = '{ WorkflowRuns: [ { WorkflowRunID: 1000, .. etc .. } ]'; 

$("#tblWorkflowRuns").jqGrid({ 
    datatype: "local", 
    data: JSONstring.WorkflowRuns, 
    localReader: { 
     id: "WorkflowRunID", 
     repeatitems: false 
    }, 
    ... 
}); 

虽然这是有点尝试和错误。

例如,jqGrid对我来说似乎忽略了datastr: JSONstring

并注意如何使用本地数据,我需要使用localReader而不是jsonReader,否则它不会正确设置行ID。

希望这会有所帮助。

0

使用beforeSubmit()函数,您可以介入jqgrid尝试将数据发布到服务器,同时添加,编辑和删除行。

  1. 通过使用beforeSubmit()功能选项,可以捕捉到发布的数据,同时加入新行和更新本地JSON数据。

    beforeSubmit: function (postdata, formid) { 
    
    // capture posted data, create JOSN item and add to the JSON array. 
    customersData.push({ id: guid(), FirstName: postdata.FirstName, LastName: postdata.LastName, sendEmail: postdata.sendEmail }); 
    
    // Refresh the grid, so that changes to the underlining 
    // local data array is reflected in the grid. 
    $('#customerGrid').jqGrid('setGridParam', { datatype: 'local', data: customersData }).trigger('reloadGrid'); 
    
    // Close the dialog. 
    try { 
         $(".ui-icon-closethick").trigger('click'); 
        } 
        catch (ex) { } 
        return [false, '']; 
        } 
    
  2. 同样,您可以使用beforeSubmit()函数选项捕获更新的字段值并更新本地JSON数据。
  3. 对于从网格中删除一行也是如此,这反映了已从本地数据中删除的项目。

对于一个完整的解决方案,您可以查看working with local data in jqgrid

相关问题