jqGrid中idPrefix的使用

jqGrid中idPrefix的使用,jqgrid,Jqgrid,给定一个用本地数据填充并使用idPrefix选项创建的jqGrid:“custTable”,所有生成的行都会在html id中获得前缀,即custTableRow_1 custTableRow_2等。这个idPrefix版本的id是否需要传递给jqGrid方法,如果需要,是哪些方法 例如,要删除具有deleteRowData的行,是否需要前缀id?setRowData或addRowData如何?在第x行之后添加时,似乎需要为srcrowid参数添加前缀。多选行怎么样 如果使用带前缀的行id删除行

给定一个用本地数据填充并使用idPrefix选项创建的jqGrid:“custTable”,所有生成的行都会在html id中获得前缀,即custTableRow_1 custTableRow_2等。这个idPrefix版本的id是否需要传递给jqGrid方法,如果需要,是哪些方法

例如,要删除具有deleteRowData的行,是否需要前缀id?setRowData或addRowData如何?在第x行之后添加时,似乎需要为srcrowid参数添加前缀。多选行怎么样

如果使用带前缀的行id删除行,它将从显示中消失,但当我重新加载网格时,删除项将再次显示在网格中,就像它没有被删除一样。不使用idPrefix时不会发生这种情况


感谢您的帮助。

引入了选项
idPrefix
,使HTML页面上的ID保持唯一,即使页面上有从服务器加载的rowids等ID。典型的例子是从服务器加载数据的两个网格。让我们在您使用的数据库中或在
主键的定义中为您提供两个表。在这种情况下,主键将在表中自动生成,并且在表中是唯一的,但在表上没有唯一的。因此,如果您将主键用作网格的id,并在一个页面上放置两个网格,则可以获得id副本

要解决此问题,您可以在第一个网格中使用
idPrefix:“a”
作为附加选项,并在第二个网格中使用
idPrefix:“b”
。在本地情况下,jqGrid将使用带有前缀的everywhere ID,但如果将ID发送到服务器,则前缀将被删除

因此,您将在本地所有回调(事件)和所有方法(如
setRowData
addRowData
等)中看到带有前缀的ID,但在服务器端的ID上,前缀将在发送到服务器之前立即删除

另外,我建议您阅读我今天发布的ids中的限制

更新:我查看了您在JSFIDLE上提出的代码,发现您的代码中有一些明显的错误。您可以输入当前代码

1) 使用错误的算法生成新行的id。例如,下面的代码

//创建动物的一般方法
函数newAnimal(集合,默认值){
var next=collection.length+1;
var newpet={
id:接下来,
name:defaults.name+next,
品种:默认值
};
归还新宠物;
}
对新id使用
collection.length+1
。如果允许删除项目,则错误。通过添加两个项目,从中删除一个项目,再添加一个新项目,id重复。相反,使用一些只会递增的变量更安全。例如,您可以使用非常简单的代码

2) 通过手动添加前缀调用
addRowData
(请参见下面的
dogsPrefix+newdog.id
)。这是错误的,因为jqGrid将前缀再次添加到行中

//添加狗按钮操作
$('#dogAddAtEnd')。单击(函数(){
var newdog=newAnimal(dogs,dogDefaults);
狗。推(新狗);
dogsadded();
jqGrid('addRowData',dogsPrefix+newdog.id,newdog);
});
可能还有更多的问题,但至少这些问题可以解释您所描述的问题

更新2:我检查了你发布的内容。它仍然有台词

grid.jqGrid('addRowData',newanimal.id,newanimal,
“之后”,前缀+后面的ID);

dogsTable.jqGrid('addRowData',dogsPrefix+newdog.id,newdog);
必须固定到哪个位置

grid.jqGrid('addRowData',newanimal.id,newanimal,
“之后”,以下ID);

dogsTable.jqGrid('addRowData',newdog.id,newdog);
尽管如此,我还是在更改后测试了演示,并在
addRowData
delRowData
setRowData
的代码中发现了错误。问题在于
delRowData
setRowData

var pos=$t.p.\u指数[rowid];
可以固定为以下值:

var id=$.jgrid.stripref($t.p.idPrefix,rowid),pos=$t.p.\u index[id];
addRowData
的内部,我建议包含该行

var id=rowid;//无前缀的纯id
以前

rowid=t.p.idPrefix+rowid;
of
addRowData
。of
addRowData

lcdata[t.p.localReader.id]=rowid;
t、 p._索引[rowid]=t.p.data.length;
应改为

lcdata[t.p.localReader.id]=id;
t、 p._索引[id]=t.p.data.length;
将使用非固定id的位置

您演示的修改代码,使用您可以测试的固定版本

稍后我会将我的bug报告发布到,以通知jqGrid的开发人员。我希望很快这个bug修复将包含在jqGrid的主代码中

此外,我建议您使用
$.jgrid.stripPref
方法从行ID中去除前缀。例如函数

//已选择常规删除
函数deleteSelectedAnimal(列表、网格、前缀)
{
var sel=grid.jqGrid('getGridParam','selrow');
如果(选择长度)
{
var gridrow=sel;
//获取未固定的模型id
var modelid=gridrow;
if(prefix.length!==0)
{
modelid=modelid.split(前缀)[1];
}                
//让它成为一个数字
modelid=编号(modelid);
//删除集合中的行
list=removeanmal(list,modelid);
//删除网格中的行
jqGrid('delRowData',gridrow);
}
}
从可以重写为以下内容

//常规删除选择