jqGrid中的idPrefix用法

时间:2012-03-14 06:53:12

标签: jqgrid

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

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

引入了选项idPrefix,以便在HTML页面上保存ids ,即使您在页面上有ids,例如从服务器加载的rowid。典型示例是两个网格,其中数据是从服务器加载的。我们在数据库中有两个表,您在PRIMARY KEY的定义中使用IDENTITYAUTOINCREMENT。如果主键将在表中自动生成,并且在表内是唯一的,但表中没有唯一的 over 。因此,如果您将主键用作网格的ID并放置在一个页面两个网格上,则可以使用id重复项。

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

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

我建议您另外阅读another answer关于我今天发布的ID的限制。

更新:我查看了您在jsfiddle上提出的代码,并在代码中发现了一些明显的错误。你当前的代码

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

// generic way to create an animal    
function newAnimal(collection, defaults) {
    var next = collection.length + 1;
    var newpet = {
        id : next,
        name: defaults.name + next,
        breed: defaults.breed
    };
    return newpet;
}

使用collection.length + 1作为新ID。如果您允许删除项目,那就错了。通过添加两个项目,从那里删除一个项目并再一次添加新项目到id重复项。相反,使用一些仅增加的变量更安全。您可以使用$.jgrid.randId(),例如哪个代码非常简单。

2)您通过手动添加前缀来呼叫addRowData(请参阅下面的dogsPrefix+newdog.id)。这是错误的,因为jqGrid再次向行添加前缀。

// add dog button actions    
$('#dogAddAtEnd').click(function() {
    var newdog = newAnimal(dogs, dogDefaults);
    dogs.push(newdog);
    dogAdded();        
    dogsTable.jqGrid('addRowData', dogsPrefix+newdog.id, newdog);
});

可能存在更多问题,但至少这些问题可以解释您所描述的问题。

更新2 :我检查了您发布的new demo。它还有行

grid.jqGrid('addRowData', newanimal.id, newanimal,
            "after", prefix+ followingId);

dogsTable.jqGrid('addRowData', dogsPrefix+newdog.id, newdog);

必须固定为

grid.jqGrid('addRowData', newanimal.id, newanimal,
            "after", followingId);

dogsTable.jqGrid('addRowData', newdog.id, newdog);

尽管如此,我在更改后测试了该演示,并发现了addRowDatadelRowDatasetRowData代码中的错误。问题出在delRowData的{​​{3}}和setRowData的{​​{3}}

var pos = $t.p._index[rowid];

可以修复为以下

var id = $.jgrid.stripPref($t.p.idPrefix, rowid), pos = $t.p._index[id];

addRowData内部我建议加入

var id = rowid; // pure id without prefix

之前the line

rowid  = t.p.idPrefix + rowid;
addRowData

addRowData

the same line
lcdata[t.p.localReader.id] = rowid;
t.p._index[rowid] = t.p.data.length;

应改为

lcdata[t.p.localReader.id] = id;
t.p._index[id] = t.p.data.length;

将使用未加前缀的ID。

使用固定版the line的修改后的代码示例,您可以测试Another tow lines

稍后我会将我的错误报告发布到jquery.jqGrid.src.js,以通知开发人员jqGrid。我希望很快将错误修复程序包含在jqGrid的主代码中。

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

//general delete selected 
function deleteSelectedAnimal(list, grid, prefix)
{
    var sel = grid.jqGrid('getGridParam', 'selrow');
    if (sel.length)
    {
        var gridrow = sel;  

        //get the unprefixed model id
        var modelid = gridrow; 
        if (prefix.length !== 0)
        {
           modelid = modelid.split(prefix)[1];     
        }                
        // make it a numeric
        modelid = Number(modelid);

        //delete the row in the collection  
        list = RemoveAnimal(list, modelid);

        //delete the row in the grid
        grid.jqGrid('delRowData', gridrow);
    }
}
来自here

可以改写为以下

//general delete selected
function deleteSelectedAnimal(list, grid)
{
    var sel = grid.jqGrid('getGridParam', 'selrow'),
        gridPrefix = grid.jqGrid('getGridParam', 'idPrefix');
    if (sel !== null)
    {
        //delete the row in the collection
        // ??? the gogs list will be not modified in the way !!!
        list = RemoveAnimal(list, $.jgrid.stripPref(gridPrefix, sel));

        //delete the row in the grid
        grid.jqGrid('delRowData', sel);
    }
}

我不确定行list = RemoveAnimal(list, $.jgrid.stripPref(gridPrefix, sel));或函数RemoveAnimal是否符合您的要求,但这不是与jqGrid相关的问题。

关于您的代码的另一个小评论。您已在已添加到网格中的id属性的对象中使用。它与trirand中定义的名称相同。如果id属性中的数据将用作网格行(id)的<tr>属性。本地data参数会将id另外保存到从name项的colModel属性构建的其他属性中。所以我认为定义隐藏列

是没有意义的
{ key: true, name: 'id', align: 'left', hidden: true }

如果您从所使用的网格中删除 id列,那么您在your demo上的显示效果与以前完全相同。

更新3 :正如我在发布相应错误报告localReader.id之前所承诺的那样。