ExtJS 4:grid:如何选择新创建的记录?

时间:2011-08-02 21:51:32

标签: extjs grid selection extjs4

我的问题很简单,就在标题中!

这是我的代码:

userCreate: function(button) {
    var grid = button.up('panel'),
        store = grid.getStore();

    /* Create new empty record */
    var inst = store.add({})[0];
    store.sync();
    /* select the newly created record */
    grid.getSelectionModel().select(inst.id);

    Ext.create('GS.view.user.Edit', { create:true }); 
},  

现在我只想要

之后的那一行
    /* select the newly created record */

上班!

我尝试了很多东西,但没有一个能奏效:

    grid.getSelectionModel().select(inst.id);
    grid.getSelectionModel().select(inst);
    grid.getSelectionModel().select(store.last);

有什么想法吗?

非常感谢

7 个答案:

答案 0 :(得分:1)

像@Tom所说的...... 使用网格视图选择新记录,然后使用 您仍然可以通过选择模型选择新记录......

来自docs .. select方法需要3个参数才能通过..
所以在你的情况下:

userCreate: function(button) {
    var grid = button.up('panel');
    store = grid.getStore();

    /* Create new empty record */
    var inst = store.add({})[0];
    store.sync();

    /* select the newly created record via model*/
    grid.getSelectionModel().select(inst, true, true);

    /* select the newly created record via view*/
    grid.getView().select(inst, true, true);

    Ext.create('GS.view.user.Edit', { create:true }); 
},

答案 1 :(得分:1)

这是我发现的:当没有“id”字段时,ExtJS似乎丢失了。 因此,在调用sync()之后,如果您没有精确的“id”字段,它会重新组织网格,无法找到“旧”记录(我在电话会议之前记住的记录)。 这就是我的想法,我可能错了。

无论如何,我已经扭转了局面:保持“同质性”,我将xxxCreate()xxxCreateValidate()xxxUpdate()xxxUpdateValidate()相同。我已经为例子做过:user => userCreate()userCreateValidate()userUpdate()userUpdateValidate()

init: function () {
    this.control({
        /* (!) Actions in 'userlist' */
        'userlist': {
            itemdblclick: this.userEdit
        },  
        'userlist button[action=create]': {
            click: this.userCreate
        },  
        'userlist button[action=delete]': {
            click: this.userDelete
        },  
        /* (!) Actions in 'useredit' */
        'useredit button[action=create]': {
            click: this.userCreateValidate
        },  
        'useredit button[action=save]': {
            click: this.userEditValidate
        }   
    }); 
},  

userCreate: function(button) {
    /* Using Ext.create() to pass variable create:true
     * instead of the shortcut:
     * var view = Ext.widget('useredit');
     */
    var view = Ext.create('GS.view.user.Edit', {
        create:true
    }); 
},  

userCreateValidate: function(button) {
    var win    = button.up('window'),
        form   = win.down('form'),
        values = form.getValues();

    this.getUsersStore().add(values);
    this.getUsersStore().sync();
    win.close();
},  

userEdit: function(grid, record) {
    var view = Ext.widget('useredit');
    view.down('form').loadRecord(record);
},  

userEditValidate: function (button) {
    var win    = button.up('window'),
        form   = win.down('form'),
        record = form.getRecord(),
        values = form.getValues();

    record.set(values);
    win.close();
    this.getUsersStore().sync();
},

我希望我的代码可以帮助某人......现在我正在寻找一种方法来处理Grid中的键。就像ExtJS的所有内容一样:你没有花时间编码,因为一切都已经完成,你花时间 搜索 ......实际上它更令人沮丧=)< / p>

无论如何,最重要的是要注意新添加的记录是而不是。这只是一种继续发展的解决方法,但这不是我想要的(这不是我在问题中所要求的)。

答案 2 :(得分:0)

网格行选择通常在View对象中处理(在ExtJS 3中是GridView)。所以我想如果您更新上面的代码看起来像:

grid.getView()选择(0)。

这将选择索引0处的行,该行看起来就像您要添加新记录的位置。然后,View对象将通知选择模型并更新浏览器视图。您可以通过http://docs.sencha.com/ext-js/4-0/#/api/Ext.grid.View-method-select

上的API文档找到其他选择选项

答案 3 :(得分:0)

使用grid.getSelectionModel().select(inst);时的示例works fine。因此,导致此类行为的唯一因素是store.sync();抛出异常。检查控制台输出是否有错误。

答案 4 :(得分:0)

我不知道是否有可能直接选择此记录,因为在同步之前,该记录是商店中的虚拟记录,但之后没有。另外,你可能会在服务器端(?)为它分配一个id,这会改变记录,并且在sync()之后它也不会相同......

如果记录中的某些字段是唯一的(例如名称或说明或任何内容),您可以使用它在同步后查找此记录并选择它:

var value = store.getAt(0).get('name');           // getting the value of a unique field e.g. "name" from the newly added record

store.sync();

var rec = store.findRecord("name", value);   // find the record with the unique value "name" after sync
grid.getSelectionModel().select(rec);       // select that record

答案 5 :(得分:0)

我认为这里的问题是你在调用store.sync();后尝试选择记录,但这实际上是异步请求,它在从服务器获取数据后更新存储。

从服务器更新商店后尝试调用grid.getSelectionModel().select。这种方法的问题是store.sync不支持任何回调方法,但您应该能够在商店中使用datachanged事件,这应该在商店同步全部完成后触发。

尝试这样的事情(基于您提供的有限代码示例):

userCreate: function(button) {
    var grid = button.up('panel'),
        store = grid.getStore();

    /* Create new empty record */
    var inst = store.add({})[0];

    store.on('datachanged', function() {
        /* select the newly created record, keep existing selection and
           don't suppress events because grid view is updating upon this event
        */
        grid.getSelectionModel().select(inst, true, false);
        Ext.create('GS.view.user.Edit', { create:true }); 
    });

    store.sync();
},

答案 6 :(得分:-1)

你可以这样使用:

grid.getSelectionModel().select(store.data.length-1)