Как программно установить редактор для столбца в сетке

У меня есть Ext.grid.Panel с набором столбцов. Эта сетка фильтруется, и в зависимости от фильтра я хотел бы определить редактор для столбца.

Моя сетка:

Ext.define('Mb.view.MyPanel', {
    extend: 'Ext.grid.Panel',
    columns: [
        {text: 'Order #', dataIndex: 'id'},
        {text: 'Action', dataIndex: 'type',
            renderer: function(value){
                if(value == 'BP') return Lang._('Veuillez choisir')
                 return ''
            }
        },

Теперь я хотел бы сделать что-то вроде:

var panel = Mb.app.getView('MyPanel');
if (condition == true) {
    panel.getColumns[1].setEditor({
        xtype: 'textfield',
        ...
    })
}

Очевидно, что методов getColumns и setEditor не существует. Поэтому мне нужен другой метод, чтобы активировать редактор для этого столбца.
Я не нашел способа получить доступ к определениям столбцов, изменить их и впоследствии повторно отобразить сетку.

Не подскажете, в каком направлении искать? Спасибо.


person Lorenz Meyer    schedule 03.12.2013    source источник


Ответы (1)


Ознакомьтесь с документацией по getEditor() на странице Ext.grid.column.Column. Если вы используете плагин редактирования, плагин обеспечивает реализацию для getEditor(), а также setEditor(). На основе редактируемого столбца и любой пользовательской логики, которую вы реализуете, вы можете реализовать собственный метод getEditor() для возврата любого экземпляра редактора, который вы хотите, в зависимости от обстоятельств.

В документации говорится:

getEditor( record, defaultField ) : Ext.form.field.Field

Это действительно говорит небольшую часть правды.

  • getEditor — это не только метод Ext.grid.column.Column, но и параметр конфигурации.
  • Если getEditor определено как опция конфигурации, функция get вызывается как getEditor( record ) и должна возвращать Ext.grid.CellEditor.
  • Это будет работать с плагином редактирования ячеек, но не с плагином редактирования строк.

Вот пример конфигурации столбца. Он создаст поле со списком только для выбранных строк:

columns: [{
    text: 'Action', dataIndex: 'action', 
    getEditor: function(record){
        if( my logic ){
            return Ext.create('Ext.grid.CellEditor', {
                field: Ext.create( 'Ext.form.field.ComboBox', {
                    forceSelection: true,
                    store: [[1, 'Option 1'], [2, 'Option 2']]
                })
            })
        } else return false;
    }
},
person existdissolve    schedule 03.12.2013
comment
Кажется, я понял идею: я пишу getEditor(record) и возвращаю любое поле, похожее на строку. Но где мне его определить? Как вариант конфигурации колонки? Это также означает, что могут быть разные редакторы на основе строк, я прав? - person Lorenz Meyer; 03.12.2013
comment
С другой стороны, когда я хочу использовать метод столбца setEditor, мне нужна ссылка на столбец, и я не знаю, как получить это из объекта сетки. - person Lorenz Meyer; 03.12.2013
comment
Да, вы просто определяете getEditor() для определения столбца. Взгляните на эту скрипту в качестве примера: fiddle.sencha.com/#fiddle/2d - person existdissolve; 03.12.2013
comment
Конечно, рад, что был полезен! - person existdissolve; 04.12.2013
comment
Это сильно недокументировано. Я редактирую ваш ответ, чтобы включить ваш пример. - person Lorenz Meyer; 04.12.2013