Как повторно очистить ComboBox, когда forceSelection установлен в TRUE (ExtJS 4) - PullRequest
20 голосов
/ 21 февраля 2012

У меня есть поле со списком, для которого forceSelection config имеет значение true.

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

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

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

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

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

Ответы [ 11 ]

28 голосов
/ 14 мая 2012

Я решил эту проблему с помощью слушателя 'change'.Пример фрагмента кода

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

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

1 голос
/ 09 июня 2014

Используйте следующее в качестве базового списка:

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();
                }
            });
        }
    }
})
1 голос
/ 21 февраля 2012

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

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

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

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

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

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

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

1 голос
/ 21 февраля 2012

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

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

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

1 голос
/ 21 февраля 2012

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

0 голосов
/ 30 апреля 2014

Попробуйте это

listeners:{change:{fn:function(combo, value){combo.clearValue();}}}
0 голосов
/ 28 марта 2014

в конфиге комбо добавить

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

PS: идея от @ aur1mas

0 голосов
/ 24 октября 2013

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

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

            me.callParent(arguments);
        },
    });
0 голосов
/ 02 июля 2013

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

0 голосов
/ 18 июня 2013

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

Вместо:

if (me.forceSelection) {

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

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