2011-12-28 5 views
4

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

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(); 
      } 
     } 
    }, 
    // ... 
}); 

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

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

ответ

2

Это, как я ее решил:

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

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