gpt4 book ai didi

jqgrid - 排序或过滤后丢失的免费 jqgrid 自定义格式化程序

转载 作者:行者123 更新时间:2023-12-01 11:27:53 24 4
gpt4 key购买 nike

我正在使用免费的 jqgrid 4.13.0

我写了一个自定义格式化程序,但不幸的是,在对表格进行排序或过滤后,该列的单元格内容总是丢失。我可能在格式化程序功能中做错了什么,但还没有真正理解缺少什么。任何人都可以发现我的错误?为什么内置的可以正常工作,而我的不行。我受到了这个启发:http://www.ok-soft-gmbh.com/jqGrid/CascadingFormater.htm

我可以看到示例如何调用 $.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');

对象 jsonData 如下所示:
Object { rows=[623],  so_total_total=4321, in_total_total=1234 }

在属性(property) rows可以找到这个:
[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...]

非常感谢您的帮助!

编辑:我添加了一个 jsfiddle 来演示问题,在过滤器中搜索 end 并查看数据如何消失。排序也是如此。 http://jsfiddle.net/tztj9yn7/2/

最佳答案

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

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

  • 添加隐藏列 name: "so_enduser_id"
  • 替换 datatype: "jsonstring", datastr: jsonDatadatatype: "local", data: jsonData.rows并替换 jsonReaderlocalReader: { id: 'crmentity_id' } .在使用 datatype: "local" 的情况下,输入数据将与所有属性一起保存(就像在输入中一样)问题将得到解决。

  • 如果您需要直接从 URL 加载数据,那么第二种方法 ( datatype: "local" ) 将是不可能的,唯一的方法是为您以后需要的所有属性使用隐藏列。

    免费的jqGrid为你提供了另一种非常简单的方法: additionalProperties的用法选项。 additionalProperties的想法很简单。有时需要从每一项输入数据中保存一些额外的属性,以便稍后在本地使用(因为使用 loadonce: true)。在 DOM 中保存数据比在 JavaScript 结构中保存数据要昂贵得多。可以使用像 additionalProperties: ["crmentity_id", "so_enduser_id"] 这样的选项通知免费 jqGrid 读取一些其他属性并将其保存在本地。因此,您的代码将立即得到修复:请参阅 http://jsfiddle.net/tztj9yn7/3/

    关于在免费 jqGrid 中使用自定义格式化程序的另一项重要建议。 rowObject 存在一些重要问题范围。它只是输入项,就像它在源中一样。因此,如果您使用 datatype: "xml"例如然后 rowObject参数将是 XML 节点。同样,如果您使用 repeatitems: true格式( ["60199", "6808", "enduser123"] 而不是 {crmentity_id:"60199", so_enduser_id:"6808", so_enduser_name:"enduser123"} )那么你将不得不使用 rowObject[1]而不是 rowObject.so_enduser_id访问该属性 so_enduser_id从初始输入数据。在下一次排序或过滤时,您将获得另一种格式 rowObject ( rowObject.so_enduser_id ) 因为输入数据将是来自本地 data 的数据范围。免费的 jqGrid 仍然使用与 rowObject 相同的格式参数 to 提供了与旧版本 jqGrid 的最佳兼容性,但它设置了 另外 rowData options 的属性(property)范围。 options.rowData总是 数据的确定性命名格式,可以随时使用 options.rowData.so_enduser_id独立于输入数据的格式和 datatype用过的。因此 options.rowData是访问输入数据的首选方式 .根本不应该使用第三个参数。格式化程序的结果代码将是

    var formatEnduser = function (cellValue, options) {
    var item = options.rowData;

    return item.so_enduser_id == undefined ?
    '' :
    '<a href="index.php?module=Accounts&view=Detail&record=' +
    item.so_enduser_id + '">' + item.so_enduser_name + '</a>';
    };

    http://jsfiddle.net/tztj9yn7/4/

    关于jqgrid - 排序或过滤后丢失的免费 jqgrid 自定义格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840551/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com