免费jqgrid自定义格式化程序在排序或筛选后丢失

免费jqgrid自定义格式化程序在排序或筛选后丢失,jqgrid,free-jqgrid,jqgrid-formatter,Jqgrid,Free Jqgrid,Jqgrid Formatter,我正在使用免费的jqgrid 4.13.0 我编写了一个自定义格式化程序,但不幸的是,在对表进行排序或筛选后,该列的单元格内容总是丢失。我可能在格式化程序函数中做了一些错误的事情,但是我还没有真正理解缺少了什么。有人能看出我的错误吗?为什么它可以与内置设备配合使用,但与我的设备却不配合。我从中得到了灵感: 我可以看到示例如何调用$.fn.fmatter.call,也许我也需要这样做。这是钥匙吗?不幸的是,如果我自己编写函数,我找不到任何关于如何实现这一点的文档 这是我的设置: var forma

我正在使用免费的jqgrid 4.13.0

我编写了一个自定义格式化程序,但不幸的是,在对表进行排序或筛选后,该列的单元格内容总是丢失。我可能在格式化程序函数中做了一些错误的事情,但是我还没有真正理解缺少了什么。有人能看出我的错误吗?为什么它可以与内置设备配合使用,但与我的设备却不配合。我从中得到了灵感:

我可以看到示例如何调用
$.fn.fmatter.call
,也许我也需要这样做。这是钥匙吗?不幸的是,如果我自己编写函数,我找不到任何关于如何实现这一点的文档

这是我的设置:

var formatEnduser = function (cellValue, options, rowObject, action){
    return rowObject.so_enduser_id == undefined ? '' : '<a href="index.php?module=Accounts&view=Detail&record='+rowObject.so_enduser_id+'">'+rowObject.so_enduser_name+'</a>';
}

$("#jqGrid").jqGrid({
    datatype: "jsonstring",
    datastr: jsonData,
    jsonReader: {
        root: 'rows',
        id: 'crmentity_id',
        repeatitems: false,
        page:  function(obj) { return 1; },
        total: function(obj) { return 1; },
        records: function(obj) { return obj.rows.length; },
    },
    autowidth: true,
    height: 600,
    shrinkToFit: true,
    rownumbers: true,
    rowNum: 5,
    pager: false,
    loadonce: true,
    viewrecords: true,
    colModel: [
        {
            name: 'crmentity_id',
            key: true,
            hidden: true
        },
        {
            label: 'Enduser',
            name: 'so_enduser_name',
            searchoptions: {
                sopt : ['cn']
            },
            formatter: formatEnduser
        },
    ]
});
$('#jqGrid').jqGrid('filterToolbar');
在属性
行中可以找到以下内容:

[Object { crmentity_id="60199",  so_enduser_id="6808",  so_enduser_name="enduser123",  mehr...}, Object { crmentity_id="60136",  so_enduser_id="6362",  so_enduser_name="userend321",  mehr...}, 620 mehr...]
非常感谢你的帮助


编辑:我添加了一个JSFIDLE来演示这个问题,在过滤器中搜索end并查看数据是如何消失的。排序也是如此

主要问题是您的代码如下所示。您使用
数据类型:“jsonstring”
,自定义格式化程序使用输入数据的属性
so\u enduser\u id
,但该属性不是网格的一列。数据类型
“jsonstring”
的处理方式与数据类型
“json”
(或“jsonp”或
“xml”
)相同。它将由jqGrid读取,并仅本地保存
colModel
jsonReader.id
中的列。因此,输入数据的属性
so_enduser_id
将仅在网格的初始读取期间在
rowObject
中可用。到目前为止,我写的所有东西对于旧jqGrid和免费jqGrid都是一样的

在使用旧jqGrid的情况下,有两种解决问题的替代方法:

  • 添加带有
    名称的隐藏列:“so\u enduser\u id”
  • datatype:“jsonstring”,datastr:jsonData
    替换为
    datatype:“local”,data:jsonData.rows
    并将
    jsonReader
    替换为
    localReader:{id:'crmentity\u id'}
    。如果使用
    datatype:“local”
    ,则输入数据将与所有属性一起保存(就像输入中的属性一样),问题将得到解决
如果您需要直接从URL加载数据,则第二种方式(
datatype:“local”
)将不可能,唯一的方式将是对您以后需要的所有属性使用隐藏列

免费jqGrid为您提供了另一种非常简单的方法:使用
additionalProperties
选项。
附加属性
的概念非常简单。有时需要从每个输入数据项中保存一些附加属性,以便以后在本地使用(因为使用了
loadonce:true
)。在DOM中保存数据比在JavaScript结构中保存数据要昂贵得多。您可以使用像
additionalProperties:[“crmentity\u id”,“so\u enduser\u id”]
这样的选项通知free jqGrid读取一些其他属性并在本地保存。因此,您的代码将立即得到修复:请参阅

关于在免费jqGrid中使用自定义格式化程序的另一个重要建议。
rowObject
参数存在一些重要问题。它只是输入项,与源代码中的输入项完全相同。因此,如果您将使用
数据类型:“xml”
作为示例,那么
rowObject
参数将是xml节点。同样,如果要使用
repeatitems:true
格式(
[“60199”、“6808”、“enduser123”]
而不是
{crmentity\u id:“60199”,so\u enduser\u id:“6808”,so\u enduser\u name:“enduser123”}
),则必须使用
行对象[1]
而不是
rowObject.so\u enduser\u id
从初始输入数据访问属性
so\u enduser\u id
。在下一次排序或筛选时,您将使用另一种格式的
rowObject
rowObject.so\u enduser\u id
),因为输入数据将是本地
数据
参数中的数据。免费jqGrid仍然使用相同格式的
rowObject
参数,以提供与旧版本jqGrid的最佳兼容性,但它另外设置了
选项
参数的
rowData
属性。
options.rowData
具有始终确定的数据命名格式,可以始终使用
options.rowData.so_enduser_id
独立于输入数据的格式和使用的
数据类型。因此,
选项。rowData
是访问输入数据的首选方式。人们根本不应该使用第三个参数。格式化程序的结果代码将是

var formatEnduser=函数(单元格值,选项){
var item=options.rowData;
return item.so_enduser_id==未定义?
'' :
'';
};

请参见

非常感谢您对问题的解决方案,更感谢您的详细解释!免费的jqGrid是一个很棒的人,但这只可能是因为像你这样了不起的人在照顾它!*“这是一个很棒的项目,但这只可能是因为很棒的人……”。
[Object { crmentity_id="60199",  so_enduser_id="6808",  so_enduser_name="enduser123",  mehr...}, Object { crmentity_id="60136",  so_enduser_id="6362",  so_enduser_name="userend321",  mehr...}, 620 mehr...]