Комбо не размывается при ручном смещении фокуса - PullRequest
4 голосов
/ 28 декабря 2011

У меня есть поле со списком, которое настроено для смещения фокуса на другой элемент формы сразу после того, как пользователь выбрал значение, с этой конфигурацией:

new Ext.form.ComboBox({
    // ...
    listeners: {
        select: function( a, record ) {
            if ( typeof( record ) == 'undefined' ) {
                return;
            }

            if ( !Ext.getCmp('input-name').getValue() ) {
                Ext.getCmp('input-name').focus();
            }
        },
        blur: function() {
            console.log('blurred');
        },
        render: function( field ) {
            if ( !config.activity ) {
                field.onTriggerClick();
            }
        }
    },
    // ...
});

Однако происходит странная вещь. Поле формы 'input-name' получает фокус, и я могу начать набирать его, но поле со списком никогда не размыто. Он по-прежнему имеет стиль «x-form-focus», и событие «blur» никогда не запускается. Только когда я щелкаю мышью по другому полю, комбо размыто.

Кто-нибудь знает, что происходит и как я могу это обойти?

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

Вот как я это решил:

listeners: {
    select: function( a, record ) {
        if ( typeof( record ) == 'undefined' ) {
            return;
        }

        /**
         * There's some weird stuff going on in the combo control, that causes it not to blur when shifting focus,
         * so we have to do it manually. This action has to be deferred, because the control is going to refocus 
         * itself at the end of the function firing this event (onViewClick()).
         */
        this.moveFocus.defer( 100, this );
    },
    render: function( field ) {
        field.moveFocus = function() {
            if ( !Ext.getCmp('input-name').getValue() ) {
                Ext.getCmp('input-name').focus();
                this.triggerBlur();
            }
        };

        if ( !config.activity ) {
            field.onTriggerClick();
        }
    }
},
0 голосов
/ 28 декабря 2011

Когда какой-либо фрагмент кода выполняется как часть события, что привело к запуску какого-то другого события, новое событие не запускается. Функция onBlur должна выполняться только тогда, когда пользователь выполняет какое-либо действие в пользовательском интерфейсе, из-за которого поле со списком теряет фокус, а не поле теряет фокус программно.

...