Доступ к подстилающей строке данных в столбце Ext.grid.Panel Выбор ComboBox - PullRequest
0 голосов
/ 11 июня 2018

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

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

Как мне это сделать?

Дополнительные сведения:

После рендеринга данных ячейки столбца в поле со списком я не могу вернуть ссылку намодель данных столбца в слое afterrender .

Если я смогу повторно ссылаться на объект данных, тогда я могу принять решение о том, чтобы разрешить сделать выбор из поля со списком.Некоторые столбцы (кортежи данных) позволяют выбрать другое значение из поля со списком, другие - нет.

Фон:

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

Хранилище, на которое я могу сослаться в методе afterrender, не является хранилищем, содержащим все данные таблицы.Он просто содержит статические данные Big-Medium-Low столбца.Но мне нужен магазин ряда;или, вернее, правильный ряд данных, который хранится в этом более глобальном хранилище.

Ext.define( 'MyTable',{

  extend: 'Ext.grid.Panel',

  xtype:'myXtypeName',

  mixins: {
    field: 'Ext.form.field.Field'
  },

  plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1} )
  ],

  store: Ext.create( 'Ext.data.Store', {
    data: [],
    autoLoad: false,
  } ),


  columns: [
    {
        header: '#',
        dataIndex: 'id',
    },
    {
        header: 'Severity',
        dataIndex:'correctionSeverity',
        sortable: false,
        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
            var myTable = Ext.ComponentQuery.query('myXtypeName');
            myTable[0].severityChangeable[ record.id ] = record.data.correctionType == 'Changed';
            return value;
        },

        editor: Ext.create( 'Ext.form.field.ComboBox', {

            queryMode: 'remote',

            store: Ext.create( 'Ext.data.Store', {
                fields: ['id', 'text'],
                data: [ { id:'entry0', text:'Big' },
                    { id:'entry1', text:'Medium' },
                    { id:'entry2', text:'Low' } ],
            } ),

            valueField: 'id',
            displayField: 'text',

            editable: false,
            forceSelection: true,

            listeners: {

                afterrender: function(combo, eOpts) {

                    // how to access the underlaying entry (row data) instead of just the column?
                    // by another value of the
                    var rowData = ???;

                    if ( rowData['preventColumnDropdown'] == true ) {
                        combo.disable();
                    }

                },

                change: function(combo, newValue, oldValue, eOpts) {
                    // do something
                },
            }
        }),

    }
  ],

  initComponent: function() {
    this.callParent(arguments);
    this.initField();
  },

  setValue: function(value) {
    this.store.loadData( value );
  },

});

Я надеюсь, что моя точка зрения и проблема понятны.Пожалуйста, дайте мне знать, если не так ...

Я использую ExtJS 6.0.0 classic.

1 Ответ

0 голосов
/ 11 июня 2018

Событие afterrender является неправильным для использования, потому что один и тот же экземпляр комбинированного списка используется повторно для всех строк.Следовательно, во время создания в выпадающем списке данные строки недоступны.

Возможно, вы захотите использовать событие beforeedit в вашем плагине CellEditing, чтобы изменить редактор перед началомРедактирование ячейки:

Ext.create('Ext.grid.plugin.CellEditing', { 
    clicksToEdit: 1,
    listeners: {
        beforeedit: function(editor, context, eOpts) {
            // Only if the combo column is being edited:
            if(context.column.dataIndex == "myComboDataIndex") {
                // Disable combobox depending on:
                editor.setDisabled(!context.record.get("AllowComboDataEdit"));
                // or just return false to stop edit altogether:
                // return context.record.get("AllowComboDataEdit");
            }
        }
    } 
});
...