如何在store.load()之后重新选择行

时间:2013-06-10 08:35:18

标签: extjs grid extjs4

我有网格面板和一个按钮 我单击按钮时,它将通过ajax传输数据,完成网格后将重新加载
我尝试重新选择行(在这里我给你的例子是第一行),但无论如何它不起作用

Ext.Ajax.request({
    url: ...,
    params: {
        v: ...                  
    },
    success: function(response){
        grid.store.load();                                            
        grid.getSelectionModel().select(0, true); // example first row

    }
})  

9 个答案:

答案 0 :(得分:9)

尝试在回调中选择行

grid.store.load({
  scope:this,
  callback:function(records, operation, success){
     grid.getSelectionModel().select(0, true); 
  }
});

grid.store.load(function(records, operation, success){
  grid.getSelectionModel().select(0, true); 
});

答案 1 :(得分:3)

通过应用以下覆盖,您可以使行选择在商店重新加载中继续存在:

Ext.override(Ext.view.View, {
    preserveSelectionOnRefresh: true,
    constructor: function() {
        this.callOverridden(arguments);
        if (this.preserveSelectionOnRefresh) {
            this.mon(this.getStore(), {
                beforeload: this.beforeStoreLoadPreserveSelectionRoutine,
                scope: this
            });
        }
    },
    beforeStoreLoadPreserveSelectionRoutine: function() {
        var sm = this.getSelectionModel(),
            selection = sm.getSelection(),
            i = 0,
            l = selection.length,
            savedSelection = [];
        delete sm.savedSelection;
        for (; i < l; i++) {
            savedSelection.push(selection[i].getId());
        }
        if (savedSelection.length) {
            sm.savedSelection = savedSelection;
        }
    }
});
Ext.override(Ext.selection.Model, {
    refresh: function() {
        // include selections saved across store reloads        
        if (this.savedSelection && this.savedSelection.length) {
            var rs = [],
                r,
                j = 0,
                l = this.savedSelection.length;
            for (; j < l; j++) {
                r = this.store.getById(this.savedSelection[j]);
                if (r) {
                    rs.push(r);
                }
            }
            if (rs.length) {
                this.select(rs, false, true);
            }
        }
        this.callOverridden();
        delete this.savedSelection;
    }
});

他们所做的只是在重新加载商店之前保存所选内容,并确保在刷新视图后再次选择这些记录。在Ext JS 4.1.2上测试。

答案 2 :(得分:2)

...如果你使用缓冲存储和Ext JS 4.2+,你可以使用scrollTo函数,它选择AND滚动视图到你的选择:

grid.store.load(function(records, operation, success){
  grid.view.bufferedRenderer.scrollTo(0, true);
});

答案 3 :(得分:2)

通过添加回调加载商店后选择行:

grid.store.load(function(records, operation, success) {
    grid.getView().select(0);
});

答案 4 :(得分:2)

grid.store.load ==&gt; grid.store.on

http://bit.ly/1iBwb2i

答案 5 :(得分:0)

在回复时,也许您可​​以使用字段来区分它:

Sencha 4.0.7:store finde

store.find(fieldName, value);

另一种方式,但我认为它在加载存储后不起作用,它的用途是:

Sencha:getLastSelected

grid.getSelectionModel().getLastSelected()

答案 6 :(得分:0)

这是一个为您照顾的插件:

https://github.com/roberto-rodriguez/ExtJs_GridMultipageSelectionPlugin

插件会在分页网格中的页面中保持选择。还包括一个名为:getSelection()的函数到网格,该函数返回一个包含所选行的ID的数组。

enter image description here

该插件假设有一个包含dataIndex的列:&#39; id&#39;

答案 7 :(得分:0)

如果您想选择上次选择的内容(不仅仅是接受的答案中显示的第一行),我认为这是最简单的:

grid.store.load(function() {
    var view = grid.getView(),
        selModel = grid.getSelectionModel(),
        lastSelected = selModel.getLastSelected();

    view.select(lastSelected);
});

或更好,是将来商店完成所有装载的监听器:

grid.store.on('load', function() {
    var view = grid.getView(),
        selModel = grid.getSelectionModel(),
        lastSelected = selModel.getLastSelected();

    view.select(lastSelected);
});

grid.store.load();

答案 8 :(得分:0)

我们在Sencha 5.0.1上遇到了同样的问题。我们发现可以通过在模型中添加idProperty来解决此问题。之后,您只需在商店中调用reload()函数即可。

在您的模型中:

idProperty: 'yourIdentifyingProperty',

然后

yourGrid.getStore().reload();

我不确定您是否还必须绑定网格的选择,但是如果上述方法不起作用,您也可以尝试这样做。