2

我对 jqGrid 还很陌生,需要从单元格中获取数据进行编辑,并且希望避免访问服务器。

由于自定义格式化程序正在向数据添加额外的标签,并且简单地使用getCell返回所有标签,我的第一个实现是剥离然后“手动”

createColumn: function (val, options) {
    return '<div style="white-space:pre-wrap">' // etc.
        + val
        + '</div>';
}
// ...
// Note: rowId is known at this point
var myData = $('#myGrid').jqGrid('getCell',rowId,'myData');
var myDataWrapper = mydata.createColumn('');
data = data.substr(myDataWrapper.length-6,data.length-myDataWrapper.length);

当然,如果有人添加更复杂的标签,这将中断。因此,我查看了getCell实际查找数据的方式。不幸的是,目前它只是搜索名称,因此代码是:

var n = -1;
val colModel = $('#myGrid').jqGrid('getGridParam','colModel');
for (var i in colModel) {
    if (colModel[i].name === 'myData') {
    n = parseInt(i)+1;
}
var myData = $('#'+rowId+' td:nth-child('+n+') div').text();

在 中复制代码似乎是错误的getCell,但似乎没有其他方法可以从名称中找到列号(至少,我找不到它!)。这也假设数据包装在 single 中div,就像在第一个版本中一样。

查看生成的 html,我注意到 jqGrid 实际上使用aria-describedby(我以前从未见过)标记了单元格。如果保证始终存在,则可以使用以下方法完成上述操作:

var myData = $('#'+rowId+' td:[aria-describedby=myGrid_myData] div').text();

但这仍然使用数据包装在单个中的假设,div当然,未来版本的 jqGrid 可能会更改或删除此属性。

所以我然后尝试了简单的解决方案,通过将数据包装在 a 中来添加一个 id,span这样我就可以很容易地找到它:

createColumn: function (val, options) {
    return '<div style="white-space:pre-wrap">' // etc.
        + '<span id="' + options.gid + '_' + options.rowId + '_' + options.colModel.name + '">' + val + '</span>'
        + '</div>';
}
// ...
var myData = $('#myGrid_'+rowId+'_MyData').text();

这似乎是最好的方法(因为我可以完全控制它)但是有没有更好的方法来获取最初传递给格式化程序函数的数据,它不会在未来可能升级到 jqGrid 时中断并且不会需要添加额外的标签?

4

1 回答 1

1

关于你问题的最初部分:

由于自定义格式化程序正在向数据添加额外的标签,并且简单地使用 getCell 也会返回所有标签......

在没有额外标签的情况下取回数据的标准方法是实现一个unformat函数。从 jqGrid 文档:

正如预定义格式器章节中提到的,所有预定义类型都与编辑模块兼容。这意味着数字、链接、电子邮件等都经过转换,以便可以正确编辑。获取数据的方法(如 getRowData 和 getCell)也使用此 unformat 来获取原始值。问题是:如果我们使用自定义格式化函数并希望在使用编辑或方法 getRowData 和 getCell 时恢复原始值,该怎么办?

答案是:您可以使用自己的自定义 unformatter 函数来做到这一点。这个函数可以在 colModel 中使用

例如:

jQuery("#grid_id").jqGrid({
...
   colModel: [ 
      ... 
      {name:'price', index:'price', width:60, align:"center", editable: true,
       formatter:imageFormat, 
       unformat:imageUnFormat},
      ...
   ]
...
});

function imageFormat( cellvalue, options, rowObject ){
    return '<img src="'+cellvalue+'" />';
}

function imageUnFormat( cellvalue, options, cell){
    return $('img', cell).attr('src');
}

有关完整的详细信息,包括参数描述,请参阅 jqGrid 文档的Unformatting部分。

于 2013-05-03T14:15:37.343 回答