当前位置: 首页 > 知识库问答 >
问题:

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

姚飞昂
2023-03-14

我正在使用免费的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 }

在属性row中可以找到以下内容:

[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并查看数据是如何消失的。排序也是如此。http://jsfiddlehtml" target="_blank">.net/tztj9yn7/2/

共有1个答案

杨赞
2023-03-14

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

如果使用旧的jqGrid,有两种替代方法可以解决此问题:

  • 添加名为“so\u enduser\u id”的隐藏列
  • 将数据类型:“jsonstring”,datastr:jsonData替换为数据类型:“local”,data:jsonData。行,并将jsonReader替换为本地读取器:{id:'crmentity\u id'}。如果使用数据类型:“本地”,输入数据将与所有属性一起保存(与输入中的属性一样),问题将得到解决

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

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

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

 类似资料:
  • 当我尝试在日期格式选项中使用正确的数据(包括时间,例如:2018-01-01 07:00:00))添加或编辑新行时,我尝试在日期格式选项中使用“newform: Y-m-d H: i: s”总是返回无效的日期警告。 有人能帮我把它正常工作吗? JSFIDLE:链接

  • 我使用的是free-jqgrid 4.15.6。我正在使用内置的货币格式化程序,它可以完美地格式化数字。我在格式化选项中使用前缀:'$',defaultValue:"。 当网格首次加载时,货币列为空的行在网格中不显示应有的格式。 但是在内联编辑之后,当编辑控件中没有输入任何内容(意味着控件没有输入任何值)时,在编辑之后,预定义的格式化程序会在单元格中显示“$”,而不是根据需要显示空白。 查看源代码

  • (版本免费jqgrid 4.13.6) 我有一些datetime列,我将其定义为{…格式化程序:“date”…},没关系。 现在,在某些情况下,根据字段值,我需要使用另一个自定义格式化程序。由于formatter:"date"是jqgrid原生的,我不知道如何解决这种情况。 示例:通常字段值是datetime,例如“2017-04-18 10:06”,这对于格式化程序来说是可以的:“date”。但

  • 我们发现,再次使用GridUnload和grid load时,工具栏搜索将被完全删除: 此行已删除完成。

  • 前言 我们接着上一篇文章01-04来讲。 过滤器的概念 概念:Vue.js 允许我们自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值表达式、 v-bind表达式。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符指示。 Vue1.X中的系统过滤器 Vue提供了一系列的固定逻辑来使程序员更加容易的实现这些功能,这些过滤器称之为系统过滤器。

  • 我是Spring MVC的新手,我刚刚遇到Spring自定义格式化程序。所以我试图为java.util.date创建一个自定义格式化程序。 MyDateFormatter.java