2012-02-21 5 views
20

У меня есть поле со списком с forceSelection config установлено в true.Как перезапустить ComboBox, когда forceSelection установлен в TRUE (ExtJS 4)

Комбинированная коробка не является обязательной. Он может быть пустым.

Если пользователь выберет один из вариантов, а затем повторно запустит поле со списком, он не хочет быть пустым.

В комбинированном поле всегда восстанавливается выбранное ранее значение.

Это смешно. Он должен быть пустым, когда пользователь удаляет значение.

Как решить эту проблему? Есть ли конфигурация, которую я пропустил?

ответ

28

Я решил эту проблему с прослушивателем «change». Пример фрагмента кода

addListener('change', function() { 
    if (this.getValue() === null) { 
    this.reset(); 
    } 
}); 

При удалении выбранного значения значение ComboBox устанавливается равным нулю. Таким образом, вы можете просто проверить это значение &, чтобы восстановить значение ComboBox по умолчанию.

+2

Хороший! Это самое элегантное решение, к которому я пришел так далеко. –

+4

Вы также можете использовать параметры события - 'addListener ('change', function (me, newVal) {if (newVal === null) {me.reset();} }); ' – phatskat

+1

Примечание: если ваш ComboBox имеет' multiSelect: true', не делайте 'newValue === null', вместо' newValue.length === 0' вместо этого (потому что это будет, очевидно, массив выборов) , –

1

Вы можете заменить forceSelection с помощью allowEmpty: false? На мой взгляд forceSelection делает все, что он должен делать - это заставляет пользователя выбирать что-то из списка. Другой вариант - добавить один дополнительный элемент в список - например, None. Поэтому пользователь может выбрать его.

+1

Thank you @innerJL. Но я не думаю, что это элегантное решение. Если есть так много дополнительных combobox, то это сделает пользователей занятыми только для выбора опции «Нет». То, что я понимаю о forceSelection: Выберите один из списка или ничего (оставьте его пустым). –

1

Я также попал в таком же проблему с комбо, и, к сожалению, самым лучшим решением, которое я придумал было IMG/кнопкой для очистки выбранного значения, то подключение следующих с помощью JQuery:

 $('#imgId').click(function() { 
      var combo = Ext.getCmp('cmpId'); 
      combo.setValue(null); 
      combo.setRawValue(null); 
     }); 

Не идеальный, но я думаю, что он довольно чистый и удобный. Надеюсь, поможет.

1

Я столкнулся с этой проблемой также.

В комбинированном поле всегда восстанавливается выбранное ранее значение.

Это не так много восстановления значения, как пользователь его повторный выбор после он удаляет значение. Т.е.: с forceSelection: true combobox настаивает на отказе от своего меню, это означает, что когда пользователь возвращается в выпадающее поле для удаления элемента, меню combobox опускается вниз, когда элемент, который был изначально выбран выделенным, затем удаляет значение в combobox и вкладки к следующему, combobox смотрит, чтобы увидеть, какой элемент выделен в выпадающем списке и заполняет его в поле, вуаля, повторно выбранный.

Вместо этого, если пользователь удаляет значение, а затем нажимает клавишу ESC, чтобы закрыть комбо выпадающее меню и затем вкладки к следующему значению не заполнит себя в.

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

К счастью, моим пользователям не потребовалось много времени, чтобы понять это и использовать клавишу ESC. Я также добавил конфигурацию preventMark: true для обработки сообщения об ошибке, когда это произошло.

Я полагаю, что если вы действительно не можете этого сделать, вы можете добавить слушателя к change или даже к событию validitychange, который проверяет, является ли поле пустым, а затем сбрасывает меню, если оно есть. Это должно препятствовать повторному выбору при переходе в другое поле таким же образом, как и закрытие клавиши ESC.

+0

Я обнаружил, что если вы удалите значение, нажмите клавишу ESC и вкладку в следующее поле, поле со списком все еще заполняет значение с помощью ExtJS 4.1.1a. Для того, чтобы сделать поле со списком, как и следовало ожидать, требуется прослушиватель изменений. –

0

Я считаю, что если у вас есть как allowBlank, так и forceSelection, установите значение true, вы действительно должны иметь возможность выбора (или у вас не будет allowBlank, установленного в true).

Вот глобальный MOD для всех списков, чтобы вести себя таким образом.

Ext.onReady(function(){ 

    // Allows no selection on comboboxes that has both allowBlank and 
    // forceSelection set to true  
    Ext.override(Ext.form.field.ComboBox, { 

     onChange: function(newVal, oldVal) 
     { 
      var me = this; 

      if (me.allowBlank && me.forceSelection && newVal === null) 
       me.reset(); 

      me.callParent(arguments); 
     },   

    }); 
}); 

Или же, это MOD также закрывает сборщик и пожары select события с нулем, когда пользователь опустошает поля:

Ext.override(Ext.form.field.ComboBox, { 

    onKeyUp: function(aEvent) { 
     var me   = this, 
      iKey   = aEvent.getKey(); 
      isValidKey = !aEvent.isSpecialKey() || iKey == aEvent.BACKSPACE || iKey == aEvent.DELETE, 
      iValueChanged = me.previousValue != this.getRawValue(); 

     me.previousValue = this.getRawValue(); 

     // Prevents the picker showing up when there's no selection 
     if (iValueChanged && 
      isValidKey && 
      me.allowBlank && 
      me.forceSelection && 
      me.getRawValue() === '') 
     { 
      // Resets the field 
      me.reset(); 

      // Set the value to null and fire select 
      me.setValue(null); 
      me.fireEvent('select', me, null); 

      // Collapse the picker 
      me.collapse(); 
      return; 
     }     
     me.callParent(arguments);   
    }, 

}); 
0

В 4.2, вы должны просто переопределить метод assertValue выпадающего списка в.

Вместо:

if (me.forceSelection) { 

Вы должны поставить:

if (me.forceSelection && (!Ext.isEmpty(value) || !me.allowBlank)) { 
0

Да у меня есть один и тот же тип выпадающий список, но я использую Editable = "ложь" и ForceSelection = "истина". Когда я выбираю значение с помощью клавиатуры и нажимаю enter, он выбирает последнее значение.

0

попробуйте использовать это. заполнить значения lastSelection = [] в пустое значение

 Ext.override(Ext.form.field.ComboBox, { 
     onChange : function(newVal, oldVal) { 
      var me = this; 
      me.lastSelection=[]; 

      me.callParent(arguments); 
     }, 
    }); 
0

в конфигурации комбо добавить

listeners: { 
    'change': function (combo, newValue) { 
     if (newValue === null) 
      combo.reset(); 
     } 
    } 

PS: идеи от @ aur1mas

0

Попробуйте

listeners:{change:{fn:function(combo, value){combo.clearValue();}}} 
1

В качестве базы данных используйте следующее:

Ext.define("Ext.ux.CleanableComboBox", { 
    extend: "Ext.form.ComboBox", 
    xtype: 'c-combobox', 
    initComponent: function() { 
     this.callParent(arguments); 
     if (this.allowBlank) { 
      this.addListener('change', function() { 
       if (!this.getValue() || this.getValue().length === 0) { 
        this.reset(); 
       } 
      }); 
     } 
    } 
}) 
Смежные вопросы