remember after refresh selected row in extjs grid

后端 未结 5 1563
借酒劲吻你
借酒劲吻你 2020-12-17 14:56

I have a problem. I use extjs grid. This grid will be refreshed every seconds.

I refresh with this function:

ND.refresh =          


        
相关标签:
5条回答
  • 2020-12-17 15:19

    i have make modification on this code. If you make selection, and aplys a filter on the store and reload it, the selection model have a first empty array in this selected collection ( at index 0 ).

    This modification is in the last line of the "refreshSelection" function.

    if (newRecordsToSelect.length >= 1){
            this.getSelectionModel().select(newRecordsToSelect);
            Ext.defer(this.setScrollTop, 30, this, [this.getView().scrollState.top]);
        }
    
    0 讨论(0)
  • 2020-12-17 15:22

    The straightforward solution is just save somewhere in js index of selected row. Then after reload you could easily select this row by index using grid's selection model.

    Get selection model: http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.Panel-method-getSelectionModel

    var selectionModel = grid.getSelectionModel()
    

    Get selected rows: http://docs.sencha.com/ext-js/4-0/#!/api/Ext.selection.Model-method-getSelection

    var selection = selectionModel.getSelection()
    

    Set selected row back: http://docs.sencha.com/ext-js/4-0/#!/api/Ext.selection.Model-method-select

    selectionModel.select(selection)
    
    0 讨论(0)
  • 2020-12-17 15:27

    I wrote simple Ext.grid.Panel extension that automatically selects back rows that were selected before store reload. You can try it in this jsFiddle

    Ext.define('PersistantSelectionGridPanel', {
        extend: 'Ext.grid.Panel',
        selectedRecords: [],
        initComponent: function() {
            this.callParent(arguments);
    
            this.getStore().on('beforeload', this.rememberSelection, this);
            this.getView().on('refresh', this.refreshSelection, this);
        },
        rememberSelection: function(selModel, selectedRecords) {
            if (!this.rendered || Ext.isEmpty(this.el)) {
                return;
            }
    
            this.selectedRecords = this.getSelectionModel().getSelection();
            this.getView().saveScrollState();
        },
        refreshSelection: function() {
            if (0 >= this.selectedRecords.length) {
                return;
            }
    
            var newRecordsToSelect = [];
            for (var i = 0; i < this.selectedRecords.length; i++) {
                record = this.getStore().getById(this.selectedRecords[i].getId());
                if (!Ext.isEmpty(record)) {
                    newRecordsToSelect.push(record);
                }
            }
    
            this.getSelectionModel().select(newRecordsToSelect);
            Ext.defer(this.setScrollTop, 30, this, [this.getView().scrollState.top]);
        }
    });
    
    0 讨论(0)
  • 2020-12-17 15:30

    for extjs 4.1.7 users

    need a workarround about the statement in

    refreshSelection() {

    ...
    Ext.defer(this.setScrollTop, 30, this, [this.getView().scrollState.top])

    }

    thus setScrollTop no longer exists

    so a working soluction is add me.getView().preserveScrollOnRefresh = true;

    in initComponent

    Ext.define('PersistantSelectionGridPanel', {
        extend: 'Ext.grid.Panel',
        selectedRecords: [],
        initComponent: function() {
            this.callParent(arguments);
    
            this.getStore().on('beforeload', this.rememberSelection, this);
            this.getView().on('refresh', this.refreshSelection, this);
    
            //-------------------------------------------
            me.getView().preserveScrollOnRefresh = true;
            //-------------------------------------------
        },
        rememberSelection: function(selModel, selectedRecords) {
            if (!this.rendered || Ext.isEmpty(this.el)) {
                return;
            }
    
            this.selectedRecords = this.getSelectionModel().getSelection();
            this.getView().saveScrollState();
        },
        refreshSelection: function() {
            if (0 >= this.selectedRecords.length) {
                return;
            }
    
            var newRecordsToSelect = [];
            for (var i = 0; i < this.selectedRecords.length; i++) {
                record = this.getStore().getById(this.selectedRecords[i].getId());
                if (!Ext.isEmpty(record)) {
                    newRecordsToSelect.push(record);
                }
            }
    
            this.getSelectionModel().select(newRecordsToSelect);
        }
    });
    
    0 讨论(0)
  • 2020-12-17 15:32

    Here is another way to select the previously selected record:

    var selectionModel = grid.getSelectionModel()
    
    // get the selected record
    var selectedRecord = selectionModel.getSelection()[0]
    
    // get the index of the selected record
    var selectedIdx = grid.store.indexOfId(selectedRecord.data.id);
    
    // select by index
    grid.getSelectionModel().select(selectedIdx);
    

    For some reason the grid.getSelectionModel().select(record) method wasn't working for me, but selecting by index seems to work.

    Edit: found out why grid.getSelectionModel().select(record) method wasn't working. Apparently the store is reloaded, the record instances aren't the same (they have different automatically generated Ext IDs). You have to use selectAt() in this case.

    0 讨论(0)
提交回复
热议问题