Подтвердить что ты не робот

Как повторно очистить ComboBox, когда forceSelection установлен в TRUE (ExtJS 4)

У меня есть поле со списком с forceSelection config установлено в true.

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

Я считаю, что если у вас есть как 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 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 );        
    },

});

Ответ 7

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

Вместо:

if (me.forceSelection) {

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

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

в combo config add

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

PS: идея от @aur1mas

Ответ 11

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

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