ExtJS:添加网格行不会突出显示

时间:2011-02-15 05:42:35

标签: extjs grid

向网格添加行,然后单击它时,会选择(并突出显示)它。然后,单击其他位置,但新行仍然突出显示(所以现在有突出显示的行)。

拜托,有谁知道问题可能是什么?如何使其正常运行,即点击一行取消选择(去突出显示)另一行?

我重新加载页面后(所以新行不再是新行),一切都按预期工作。

修改:以下是添加行的代码:

var rec = new store.recordType({
    test: 'test'
});
store.add(rec);

编辑2 :问题似乎是listful: true。如果是false,那就有效!但是我需要它true所以我进一步看这个...看起来好像ID出现了错误...如果ID会改变(我首先创建记录,然后是服务器)返回正确的ID,这也会混淆行选择器,没有?)

2 个答案:

答案 0 :(得分:0)

看起来为您的网格启用了多选。您可以使用Ext.grid.RowSelectionModel配置网格的选择模型。

通过在网格面板中配置sm(选择模型)将您的选择模型设置为单选,如下所示:

sm: new Ext.grid.RowSelectionModel({singleSelect:true})

<强>更新

尝试使用网格存储的load方法或loadData方法重新加载网格。您是否在客户端更新网格?那么也许你可以使用loadData方法。如果您使用从远程获取数据..您可以使用加载方法。我使用load方法用新记录更新我的网格(在添加,刷新等一些用户操作之后)。或者您可以按如下方式重新加载:

grid.getStore().reload();

答案 1 :(得分:0)

(注意,正确为ExtJS 3.3.1)

首先,这是我快速而又肮脏的黑客行为。巧合的是,我的系统中扩展了CheckboxSelectionModel: -

Kore.ux.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.CheckboxSelectionModel, {

    clearSelections : function(fast){
        if(this.isLocked()){
            return;
        }
        if(fast !== true){
            var ds = this.grid.store,
                s = this.selections;
            s.each(function(r){
                //Hack, ds.indexOfId(r.id) is not correct.
                //Inherited problem from Store.reader.realize function
                this.deselectRow(ds.indexOf(r));
                //this.deselectRow(ds.indexOfId(r.id));
            }, this);
            s.clear();
        }else{
            this.selections.clear();
        }
        this.last = false;
    }
});

这是clearSelections失败的地方。他们尝试使用ds.indexOfId(r.id)取消选择行,它将返回-1,因为我们没有定义索引remapped

这就是为什么我们找不到id: -

http://imageshack.us/photo/my-images/864/ssstore.gif/

请注意,图像中的第一项未正确“重新映射”。这是因为我们Ext.data.Store中的“reMap”函数存在问题,如下所示: -

// remap record ids in MixedCollection after records have been realized.  @see Store#onCreateRecords, @see DataReader#realize
reMap : function(record) {
    if (Ext.isArray(record)) {
        for (var i = 0, len = record.length; i < len; i++) {
            this.reMap(record[i]);
        }
    } else {
        delete this.data.map[record._phid];
        this.data.map[record.id] = record;
        var index = this.data.keys.indexOf(record._phid);
        this.data.keys.splice(index, 1, record.id);
        delete record._phid;
    }
}

显然,这种方法无法解雇(或错误)。进一步追踪,此方法由Ext.data.Store.onCreateRecords

调用
....
this.reader.realize(rs, data);
this.reMap(rs);
....

第一眼看上去确实很好,但是当我追踪rsdata时,这些数据在this.reader.realize函数后神奇地设置为未定义,因此reMap可以不要将幻像记录映射回正常记录。

我不知道这个函数有什么问题,我不知道如何在JsonReader中覆盖这个函数。 如果你们中的任何人碰巧有空,请帮助我们进一步追查导致此问题的罪魁祸首

干杯

梅西