Ext-JS: как отключить редактирование ячеек для отдельных ячеек в сетке?
теперь я создаю веб-приложение с Ext-JS 4.0.2, и я использую редактируемую сетку для управления данными, которые будут показаны для таблицы на той же странице.
чтобы сделать сетку редактируемой, я следовал документации API и использовал следующее:
selType: 'cellmodel',
plugins: [
Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 2
})
]
однако для этой сетки есть несколько ячеек, которые не должны быть изменены.
Я мог бы просто позволить обработчику событий изменить данные обратно в нужное состояние, как только он будет изменен в сетке, но это кажется избитым, трудно поддерживать и нечитаемым. Есть ли лучший способ сделать это? Я читал API, но не могу найти никаких полезных атрибутов.
обновление
Что касается этого конкретного приложения, просто отключите первую строку. Но мне также интересно выбрать несколько сеток и сделать их не редактируемыми (представьте себе игру судоку с сеткой).
3 ответов
как я понял из комментариев, вы хотите, чтобы первая строка не редактируется. Есть уродливое, но быстрое решение. Назначьте вашему плагину beforeedit
обработчик. И когда событие запускается, проверьте, какая строка редактируется. Если сначала ... --4-->:
plugins: [
Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 2,
listeners: {
beforeedit: function(e, editor){
if (e.rowIdx == 0)
return false;
}
}
})
]
проверить docs на beforeedit
.
обновление
врачи говорят, что beforeedit
есть такой набор параметров:
beforeedit( Ext.grid.plugin.Editing editor, Object e, Object options )
но есть ошибки. Правильная последовательность есть:
beforeedit( Object e, Ext.grid.plugin.Editing editor, Object options )
я обновил пример из-за этого факта.
вы можете указать ColumnModel для объявления редактируемых и не редактируемых столбцов:
var cm = new Ext.grid.ColumnModel({
columns: [{
dataIndex: 'id',
header: 'id',
hidden: true
},{
dataIndex: '1',
header: '1',
editor: new Ext.form.TextField({})
},{
dataIndex: '2',
header: '2',
editor: new Ext.form.NumberField({})
},{
dataIndex: '3',
header: '3'
}]
});
var grid = new Ext.grid.EditorGridPanel({
store: store,
clicksToEdit: 2,
cm: cm
...
В этом примере столбец id
не делится, столбцы 1 и 2 редактируются (с текстовыми и числовыми редакторами), а столбец 3 не редактируется.
обновление:
запретить редактирование строк:
grid.on('beforeedit', function(event) {
if (event.row == 0) {
this.store.rejectChanges();
event.cancel = true;
}
}, grid);
Как ziyao Wei упомянул, документация для события beforeEdit неверна. Однако вам нужно ссылаться на параметр "editor", чтобы получить индекс строки и другие значения, а не первый параметр объекта "e". Обновленный пример:
plugins: [
Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 2,
listeners: {
beforeedit: function(e, editor){
if (editor.rowIdx == 0)
return false;
}
}
})
]