Как восстановить фокус сетки после перезагрузки данных в ExtJS?

#javascript #extjs #datagrid

#javascript #extjs #datagrid

Вопрос:

У меня есть представление в ExtJS, которое содержит сетку, в которой пользователь может выбрать запись, а также некоторую панель с подробной информацией о текущей выбранной строке. Каждый раз, когда выбирается другая строка, представление перезагружается, что приводит к тому, что сетка теряет фокус ввода для навигации с клавиатуры.

Как я могу перезагрузить данные хранилища сетки и сохранить фокус ввода на сетке? Моя модель определяет idProperty , и, таким образом, выбирается правильная строка, но выбор столбца и фокус ввода теряются. Я использую ExtJS версии 7.3.055 с классической темой Triton.

Пример

Расширьте код в существующей сетке с помощью хранилища JSON, поиграйте с моделью данных и некоторым прослушивателем событий сетки, чтобы воспроизвести проблему:

 Ext.application({
    name: 'Fiddle',

    launch: function () {
        // My data model with custom ID field
        Ext.define('User', {
            extend: 'Ext.data.Model',
            fields: [
                {name: 'name',  type: 'string'},
                {name: 'email', type: 'string'},
                {name: 'phone', type: 'string'},
            ],
            idProperty: 'email',
        });

        Ext.create('Ext.data.Store', {
            storeId: 'simpsonsStore',
            model: 'User',

            proxy: {
                type: 'ajax',
                // Loading data from ./simpsons.json in the fiddle ./Data folder.
                url: 'simpsons.json',

                reader: {
                    type: 'json',
                    rootProperty: 'items'
                }
            }
        });

        Ext.create('Ext.grid.Panel', {
            renderTo: Ext.getBody(),
            height: 300,
            width: "100%",
            title: 'Simpsons',

            store: 'simpsonsStore',
            autoLoad: true,

            columns: [{
                text: 'Name',
                dataIndex: 'name'
            }, {
                text: 'Email',
                dataIndex: 'email',
                flex: 1
            }, {
                text: 'Phone',
                dataIndex: 'phone'
            }],

            // Add some event handler to reload grid data, restore selected row
            listeners: {
                select: function (sender) {
                    console.log('grid selection update');
                    var record = sender.getSelected();
                    var store = sender.getStore();
                    store.load();
                    // This will restore the selected row, but grid focus is lost
                    sender.setSelected(record);
                }   
            }
        });
    }
});
 

Ответ №1:

Попробуйте поместить выделение в обработчик загрузки хранилища:

 Ext.create('Ext.grid.Panel', {
    renderTo: Ext.getBody(),
    height: 300,
    width: "100%",
    title: 'Simpsons',

    // Using Named Store
    store: 'simpsonsStore',

    // Load the data
    autoLoad: true,

    columns: [{
        text: 'Name',
        dataIndex: 'name'
    }, {
        text: 'Email',
        dataIndex: 'email',
        flex: 1
    }, {
        text: 'Phone',
        dataIndex: 'phone'
    }],
    listeners: {
        select: function (selectionRowModel, selectedRecord, selectedIndex) {
            var store = selectionRowModel.getStore();
            store.on('load', function(store) {
                selectionRowModel.select(selectedIndex, true, true);
            }, this, {
                single: true
            })
            store.load();
        }
    }
});