#grid #extjs4
#сетка #extjs4
Вопрос:
Я реализую панель сетки с четырьмя последними столбцами, которые можно редактировать для большинства строк. Проблема в том, что я хотел бы иметь возможность отключить редактирование, скажем, в первом, если record.get(‘status’) = 4, который завершен, и только два столбца должны быть доступны для редактирования.
Есть ли способ отключить отображение редактирования для этих строк? Я могу сделать это с помощью CellEditing, но хочу продолжать использовать плагин RowEditing.
С уважением, Кристиан
Ответ №1:
Использовать beforeedit
событие:
grid.on('beforeedit', function(editor, e) {
if (e.colIdx === 0 amp;amp; e.record.get('status') == 4)
return false;
});
Обновить
Приведенное выше решение не работает для rowEditor.
Однако вы можете отключить необходимое поле beforeedit
. Для этого у вас должен быть доступ к плагину редактирования строк. Присвоить PluginID плагину:
plugins: [
Ext.create('Ext.grid.plugin.RowEditing', {
clicksToEdit: 1,
pluginId: 'rowEditing'
})
],
Теперь просто отключите нужное поле, если выполнены некоторые условия:
grid.on('beforeedit', function(editor, e) {
if (e.record.get('status') === 4 ){
grid.getPlugin('rowEditing').editor.form.findField('fieldToDisable').disable();
}
else{
grid.getPlugin('rowEditing').editor.form.findField('fieldToDisable').enable();
});
Вот демонстрация (попробуйте отредактировать первую строку).
Редактировать
Если вышеупомянутый JSFiddle не работает, попробуйте его обновленную версию.
Комментарии:
1. Да, это сработало бы для редактирования ячеек. Для редактирования строк он будет срабатывать только перед вводом в действие один раз для каждой строки, а не для каждого столбца.
2. Блестяще! Сработало как шарм. Попытался удержать поле формы, но я пропустил функцию findField. Спасибо!
3. в моем случае это сработало 1-е решение, поскольку моим требованием было отключить редактирование при щелчке по столбцу действия. Спасибо..
4. вопрос 2011 года и помог мне по сей день. Спасибо всем участникам
5. @Lawrence, я сомневаюсь, что простое редактирование конфигурации решит проблему OP. Особенно в этой части
I'd like to be able to disable editing on, let's say the first one if record.get('status') = 4
. Но если вы решили это, просто опубликуйте это как ответ, чтобы это помогло другим людям.
Ответ №2:
(на основе предыдущего примера) альтернативный способ — настроить прослушиватель редактора beforeedit
:
listeners: {
beforeedit: function(editor, context) {
var form = editor.getEditor().form;
var field = form.findField('column_name');
var status = parseInt(context.record.data.status);
if (status === 4) {field.disable();} else {field.enable();}
}
}
Комментарии:
1. это повторение ответа @Molecular Man
2. @alexandre1985 это не потому, что слушатель определен совершенно по-другому; пожалуйста, узнайте об
Ext.define
этом перед голосованием.3. @alexandre1985 пожалуйста, научитесь читать / писать и понимать, а также, в первую очередь, писать сценарии ExtJS; ТЕПЕРЬ я проголосовал за ваш ответ… потому что это ясно показывает, как мало вы понимаете, о чем говорите … и я не единственный, у кого такое мнение 🙂
Ответ №3:
Поскольку ответ @Molecular Man делает отключенный столбец забавным, когда редактирование строк редактируется, я подумал о другом способе, который выглядит идеально. Все, что вам нужно сделать, это создать функцию, которая может быть, например:
function fieldFormat() {
if(isGuest) {
return null; //is not editable
} else {
//how you want the column's field config to be formated
var json = Ext.JSON.decode("{xtype: 'textfield',maxLength: 40}");
return json;
}
}
и в сетке вы помещаете что-то вроде этого:
var grid = Ext.create('Ext.grid.Panel', {
plugins: [grid_rowEditing],
store: store,
columns: [
{
text : 'Name',
dataIndex: 'name',
field : fieldFormat()
}]
});
и когда значение isGuest равно true, поле ‘name’ не будет доступно для редактирования. Если значение равно false, оно будет доступно для редактирования