ExtJS 4 Редактирование строк отключить редактирование в одном столбце на основе записи

#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, оно будет доступно для редактирования