6

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

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

    }
})  
4

9 回答 9

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); 
});
于 2013-06-10T09:01:29.623 回答
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 上测试。

于 2013-06-10T09:24:21.260 回答
2

...如果您使用的是缓冲存储和 Ext JS 4.2+,则可以使用 scrollTo 函数,该函数选择并滚动视图到您的选择:

grid.store.load(function(records, operation, success){
  grid.view.bufferedRenderer.scrollTo(0, true);
});
于 2013-06-11T15:45:48.767 回答
2

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

grid.store.load(function(records, operation, success) {
    grid.getView().select(0);
});
于 2013-06-28T02:08:08.173 回答
2

grid.store.load ==> grid.store.on

http://bit.ly/1iBwb2i

于 2014-03-19T05:57:58.570 回答
0

在响应时,也许您可​​以使用一个字段来区分它:

Sencha 4.0.7:商店查找

store.find(fieldName, value);

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

煎茶:getLastSelected

grid.getSelectionModel().getLastSelected()
于 2013-06-10T09:02:53.917 回答
0

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

在您的模型中:

idProperty: 'yourIdentifyingProperty',

然后

yourGrid.getStore().reload();

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

于 2020-08-05T09:59:34.017 回答
0

这是一个为您解决此问题的插件:

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

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

在此处输入图像描述

该插件假定有一列带有 dataIndex: 'id'

于 2016-07-13T01:44:21.657 回答
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();
于 2017-06-04T04:43:14.703 回答