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本身就是我真正想要的。我猜似乎有一个