ExtJS 6.7 — Как прикрепить события размытия и фокусировки к каждому сопутствующему элементу формы?

#extjs #extjs6

#extjs #extjs6

Вопрос:

Я хотел бы пометить каждый контейнер для переноса полей пользовательским классом css, когда поле сфокусировано, и удалить этот класс, когда поле размыто. Итак, я хотел бы прикрепить методы событий фокусировки / размытия к каждому компоненту поля формы, который я добавляю в любую форму.

в Ext 4 я сделал это следующим образом:

 Ext.ComponentManager.all.on('add', function(map, key, item) {
    // Check if item is a Window and do whatever
    if (item instanceof Ext.form.field.Base) {
        item.on('focus', function(theField) {
            var parentDom = null; //theField.bodyEl.findParent('.x-form-fieldcontainer');
            if (!parentDom) {
                parentDom = theField.bodyEl.findParent('.x-field');
            }
            if (parentDom) {
                var parentEl = Ext.get(parentDom);
                parentEl.addCls('focused-field');
            }
        }, item);
        item.on('blur', function(theField) {
            var parentDom = null; //theField.bodyEl.findParent('.x-form-fieldcontainer');
            if (!parentDom) {
                parentDom = theField.bodyEl.findParent('.x-field');
            }
            if (parentDom) {
                var parentEl = Ext.get(parentDom);
                parentEl.removeCls('focused-field');
            }
        }, item);
    }
});
  

Я не уверен, как это сделать в ExtJS 6

Любая помощь приветствуется

С уважением

Армандо

Ответ №1:

Вам это не нужно, в ExtJS уже есть css-класс ‘.x-field-focus’, который добавляется к элементу-оболочке при фокусировке, поэтому вы можете попробовать добавить свои стили к существующему классу. Вы также можете посмотреть на переменные темы $form-field-focus-*..

В любом случае, если вы хотите добавить эту функциональность, вы можете переопределить ‘Ext.form.field.Базовый’ класс, который является родительским для всех полей формы. Что-то вроде этого:

 Ext.define('overrides.form.field.Base', {
    override: 'Ext.form.field.Base',
    
    customCssOnFocus: 'focused-field',
    
    initEvents: function() {
        this.callParent(arguments);
        this.on('focus', this.addCustomCssOnFocus, this);
        this.on('blur', this.removeCustomCssOnBlur, this);
    },
    
    addCustomCssOnFocus: function() {
        Ext.get(this.getEl().findParent('.x-field')).addCls(this.customCssOnFocus);
    },
    
    removeCustomCssOnBlur: function() {
        Ext.get(this.getEl().findParent('.x-field')).removeCls(this.customCssOnFocus);
    }
});
  

Комментарии:

1. Это именно то, что я искал .. спасибо…

2. Хм, я только что заметил, что лучше создать 3-й метод, что-то вроде: get: functuin() { return Ext.get(this.getEl().findParent(‘.x-field’));} и использовать его в методах, чтобы сохранить DRY. И x-поле должно быть некоторым существующим свойством.. в базовом классе.

3. Я использовал x-form-item … и это работает для обычных полей .. но если ваши поля находятся в контейнере полей, чем DOM отличается, и это не работает, поэтому необходимо исправить методы, чтобы установить bacground для этого контейнера полей, а не для этого родительского поля.