jqGrid:更新一行并更新其格式化程序

jqGrid:更新一行并更新其格式化程序,jqgrid,Jqgrid,理想情况下我会调用setRowData并让我的单元格格式化程序和rowattr函数重新运行,但是单元格格式化程序和rowattr函数在调用setRowData时不会重新运行(我不知道为什么,但这可能是另一个问题),因此,setRowData对我没有什么帮助 看起来下一个最简单的方法是删除一行,然后在相同的位置用相同的模型重新添加一行。为此,我需要获取所选行上方行的rowid,以便调用addRowData,在srcrowid中指定上方行的ID,并在位置使用'after'。这就是我的想法: $.jg

理想情况下我会调用
setRowData
并让我的单元格格式化程序和
rowattr
函数重新运行,但是单元格格式化程序和
rowattr
函数在调用
setRowData
时不会重新运行(我不知道为什么,但这可能是另一个问题),因此,
setRowData
对我没有什么帮助

看起来下一个最简单的方法是删除一行,然后在相同的位置用相同的模型重新添加一行。为此,我需要获取所选行上方行的
rowid
,以便调用
addRowData
,在
srcrowid
中指定上方行的ID,并在
位置使用
'after'
。这就是我的想法:

$.jgrid.extend({
    updateRow: function(rowid, model){
        // get index from id
        var index = this.jqGrid('getInd', rowid);

        // note: my first row's index is 1 (is that normal?)
        if ( index == 1 ){
            position = 'first';
            srcrowid = 'n/a';
        }
        else{
            position = 'after';
            srcrowid = _____ how to get rowid of row above selected row _____???
        }

        // delete row
        this.jqGrid('delRowData', rowid);

        // insert at index
        this.jqGrid('addRowData', rowid, model.attributes, position, srcrowid);
    }
});
如何获取所选行上方行的rowid?(有没有更简单的方法?这是一个糟糕的策略?)


注意:我正在使用backbone.js集合和模型

我发现更改行的最佳方法是使用
setRowData
,而不是使用
delRowData
addRowData
。如果您知道
rowid
,则可以使用
$(“#”+rowid)
(或者如果rowis具有特殊字符,如
等等,则使用
$(“#”+$.jgrid.jqID(rowid));
)获取
元素。然后可以使用
jQuery.addClass
jQuery.css
jQuery.attr
更改行的属性

了解jqGrid在内部使用修改网格元素所需的相同方法非常重要。
rowattr
的主要目标是另一个。在填充网格数据的过程中,有许多场景。可以为
创建DOM元素并将其插入网格中。主要问题是使用DOM时的性能。这就像弦的构造一样缓慢。此外,如果元素存在于HTML页面上(与断开连接的元素相反),则DOM的速度会慢得多。如果只修改500行网格中的一个元素,则需要重新计算所有其他行元素的位置

由于这个问题,jqGrid首先以字符串格式构建整个网格,然后使用一组
innerHTML
分配所有
元素。它极大地提高了网格填充的性能。有关更多信息,请参阅。引入了格式化程序和回调
cellattr
rowttr
,以便在以字符串格式构建网格体的过程中自定义单元格和行属性。它在不降低性能的情况下为您提供了定制的可能性


另一方面,如果您需要修改HTML页面上已附加的行,那么使用字符串而不是DOM将没有任何优势。因此,我建议您直接使用
jQuery.addClass
jQuery.css
jQuery.attr
。如果您需要更改多个类、分配多个css规则或多个属性,那么您应该使用上述函数的一个调用。您可以使用对象形式
jQuery.css
jQuery.attr

下面的
updateRow
扩展可以工作,但我最终没有使用它。与其说是因为Oleg所说的原因(我认为这是有效的,您应该明确考虑),还不如说是因为我有一个太难同步的筛选器提供程序(例如,在软删除一行之后,我现在需要确定新删除的状态是否与当前筛选器一致……这是一个非常简单的示例)。所以我只是遵从过滤器提供者给我的数据,每次都重新填充网格,这我不喜欢,但我看不到其他简单的选择

就以下扩展而言,以下是我所看到的优点/缺点:

优点:

  • 易于使用
  • 您只需依赖已定义的
    rowattr
    函数和单元格格式化程序。你不必写两遍
缺点:

  • 可能是性能——参见Oleg的答案
  • 请添加您看到的任何内容
未知数:

  • 表演?我不知道它的表现有多糟糕。使用不同的浏览器进行基准测试会很有趣。我没有看到任何问题,但我只有大概20行。假设我们处理500行,添加/删除类,调用
    .css()
    需要30毫秒,但在“典型”机器/浏览器上使用扩展需要300毫秒。这会慢10倍,但对我来说可能是值得的,因为我不需要写两次
这是分机:

$.jgrid.extend({
    updateRow: function(rowid, data){
        // get index from id
        var index = this.jqGrid('getInd', rowid);

        // note: my first row's index is 1 (is that normal?)
        if ( index == 1 ){
            position = 'first';
        }
        else{
            position = 'after';
            srcrowid = $(this).find('tr#' + rowid).prev()[0].id;
        }

        // delete row
        this.jqGrid('delRowData', rowid);

        // insert at index
        this.jqGrid('addRowData', rowid, data, position, srcrowid);
    }
});

您通过
rowattr
指定了哪些属性?是需要与行的现有属性组合的属性(如
class
style
)还是替换属性的属性(如
title
id
tabindex
或其他)?常见的解决方案可能很长,但如果您指定具体的操作,那么在
setRowData
之后调用
rowattr
就可以相对容易地解决问题。@Oleg这种情况是
class
style
。但是我有
rowattr
函数和列格式化程序。另外,我正在寻找一个通用函数,该函数对于任何未来的使用都足够健壮(参考我上面包含的扩展)。关于具体查找一行,我希望有一个内置的jqGrid函数我错过了,比如
getRowIDFromRowIndex
。但是也许我只需要使用jQuery?…比如
$(this)。find('tr#'+rowid)。prev()[0]
$(this)。find('tr#'+rowid)。prev()[0]。id
来获取id本身就是我真正想要的。我猜似乎有一个