jqGrid本地数据排序丢失信息

时间:2011-07-12 15:11:44

标签: jqgrid jqgrid-formatter

好吧,我准备把头发撕掉了。我正在使用JSON数据加载jqGrid,但将“loadonce”设置为true,以使其保持本地状态。当我只显示列的默认内容时,排序工作正常,但我需要的是,对于某些列使用来自另一列的信息来修改显示的内容。例如,我不想使用“设备”和“模型”列,而是希望在一列下显示,例如“设备 - 模型”,并且我使用自定义格式化器。

问题是,在这种情况下,当我进行排序时,我丢失了“模型”信息,它变为“未定义”。这是我的代码的一部分:

mdlTable = tableWrap.jqGrid({
    url: loadURL,
    datatype: 'json',
    colNames: ['ID', 'Device', 'Description', 'IP', 'Model'],
    colModel: [
        {name:'id', index:'id', hidden:true, key:true},
        {name:'device', index:'device', width:192,
            formatter:function(value, options, rData){
                var str = "<a href='/administration/mdl/vwDevice.aspx?device_id=";
                str += rData[0] + "' target='_blank'>" + value;
                if ('' != rData[4]) str += " - " + rData[4];
                str += "</a>";
                return str;
            }
        },
        {name:'desc', index:'desc', width:256, sortable:false},
        {name:'ip', index:'ip', width:96},
        {name:'model', index:'model', hidden:true}
    ],
    sortname: 'id',
    viewrecords: true,
    loadonce: true,
    viewsortcols: [true,'vertical',true],
    gridview: true,
    ignoreCase: true
})
.navGrid('#deviceList_footer', {edit:false, add:false, del:false, cloneToTop:true});

正如您所看到的,我隐藏了模型列,并将该信息“移动”到设备列,因为这是它所显示的位置。它在加载时都很好,但是一旦我进行排序,或者搜索并刷新视图,数据的“复制”就会因某种原因而丢失。如果我向模型列显示信息仍然很好,那就是设备列获得“未定义”值。

我试过触发“reloadGrid”,没有帮助。我也尝试添加unformat函数,但我不确定我能在那里做什么。我基本上刚刚返回$(cellobject).html() - 这显然不起作用。

编辑:添加了示例JSON数据

{ "rows" : [{
        "id" : "181",
        "cell" : ["181", "Router A", "some description", "55.444.33.222", "Model 1"]
    }, {
        "id" : "291",
        "cell" : ["291", "Router B", "some description", "55.333.22.444", "Model 2"]
    }, {
        "id" : "1346",
        "cell" : ["1346", "Router C", "some description", "55.111.44.333", "Model 3"]
    }, {
        "id" : "1999",
        "cell" : ["1999", "Router D", "some description", "55.222.11.000", "Model 4"]
    }
]}

1 个答案:

答案 0 :(得分:7)

问题是,在开始时,自定义格式化程序的第三个参数具有数组类型,之后不再存在。所以你必须将格式化程序修改为

formatter: function(value, options, rData){
    var model = '',
        str = "<a href='/administration/mdl/vwDevice.aspx?device_id=" +
              value + "' target='_blank'>" + value;
    if ($.isArray(rData)) {
        model = rData[4];
    } else {
        model = rData.model;
    }
    if (model) {
        str += " - " + model;
    }
    str += "</a>";
    return str;
}

然后排序将起作用:见here

还有一个提示。您使用key:true列的id属性。如果您不需要两次包含相同的id值。您可以将JSON数据减少到以下

{ "rows" : [
    ["181", "Router A", "some description", "55.444.33.222", "Model 1"],
    ["291", "Router B", "some description", "55.333.22.444", "Model 2"],
    ["1346", "Router C", "some description", "55.111.44.333", "Model 3"],
    ["1999", "Router D", "some description", "55.222.11.000", "Model 4"]
]}

为了能够读取新的JSON格式,jqGrid中唯一的变化是附加参数jsonReader: {cell:''}。查看结果here