Как получить поле со списком extjs, чтобы оно действовало как обычное поле выбора html? - PullRequest
20 голосов
/ 20 января 2010

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

Мне не нужны эти функции. Мне нужен блок выбора, который ведет себя почти так же, как можно было бы ожидать нормальный блок выбора в vanilla html.

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

Итак, как я могу получить поле со списком extjs, которое будет больше похоже на поле выбора? Или я вообще использую неправильный виджет?

Ответы [ 5 ]

32 голосов
/ 20 января 2010

Такое поведение можно получить, просто используя правильную конфигурацию при создании экземпляра объекта Ext.form.ComboBox:

var selectStyleComboboxConfig = {
    fieldLabel: 'My Dropdown',
    name: 'type',
    allowBlank: false,
    editable: false,
    // This is the option required for "select"-style behaviour
    triggerAction: 'all',
    typeAhead: false,
    mode: 'local',
    width: 120,
    listWidth: 120,
    hiddenName: 'my_dropdown',
    store: [
        ['val1', 'First Value'],
        ['val2', 'Second Value']
    ],
    readOnly: true
};
var comboBox = new Ext.form.ComboBox(selectStyleComboboxConfig); 

Замените аргумент mode: 'local' и store в вашем случае, если вы хотите, чтобы он был связан, например, с Ext.data.JsonStore.

7 голосов
/ 24 марта 2011

Принятое в настоящее время решение отлично работает, но если кому-то нужен ComboBox, который также обрабатывает ввод с клавиатуры, как обычный блок выбора HTML (например, каждый раз, когда вы нажимаете «P», выбирается следующий элемент в списке, начинающийся с «P»). ), может быть полезно следующее:

{
    xtype: 'combo',
    fieldLabel: 'Price',
    name: 'price',
    hiddenName: 'my_dropdown',
    autoSelect: false,
    allowBlank: false,
    editable: false,
    triggerAction: 'all',
    typeAhead: true,
    width:120,
    listWidth: 120,
    enableKeyEvents: true,
    mode: 'local',
    store: [
        ['val1', 'Appaloosa'],
        ['val2', 'Arabian'],
        ['val3', 'Clydesdale'],
        ['val4', 'Paint'],
        ['val5', 'Palamino'],
        ['val6', 'Quarterhorse'],
    ],
    listeners: {
        keypress: function(comboBoxObj, keyEventObj) {
            // Ext.Store names anonymous fields (like in array above) "field1", "field2", etc.
            var valueFieldName = "field1";
            var displayFieldName = "field2";

            // Which drop-down item is already selected (if any)?
            var selectedIndices = this.view.getSelectedIndexes();
            var currentSelectedIndex = (selectedIndices.length > 0) ? selectedIndices[0] : null;

            // Prepare the search criteria we'll use to query the data store
            var typedChar = String.fromCharCode(keyEventObj.getCharCode());
            var startIndex = (currentSelectedIndex == null) ? 0 : ++currentSelectedIndex;

            var matchIndex = this.store.find(displayFieldName, typedChar, startIndex, false);

            if( matchIndex >= 0 ) {
                this.select(matchIndex);
            } else if (matchIndex == -1 && startIndex > 0) {
                // If nothing matched but we didn't start the search at the beginning of the list
                // (because the user already had somethign selected), search again from beginning.
                matchIndex = this.store.find(displayFieldName, typedChar, 0, false);                                
                if( matchIndex >= 0 ) {
                    this.select(matchIndex);
                }
            }

            if( matchIndex >= 0 ) {
                var record = this.store.getAt(matchIndex);
                this.setValue(record.get(valueFieldName));
            }
        }
    }
}
2 голосов
/ 04 ноября 2010
var buf = []; 
buf.push('<option>aA1</option>');
buf.push('<option>aA2</option>');
buf.push('<option>bA3</option>');
buf.push('<option>cA4</option>');

var items = buf.join('');
new Ext.Component({
    renderTo: Ext.getBody(),
    autoEl: {
         tag:'select',
         cls:'x-font-select',
         html: items
    }
 });
2 голосов
/ 20 января 2010

Вы пробовали typeAhead = false? Не слишком уверен, если это близко к тому, что вы хотите.

var combo = new Ext.form.ComboBox({
    typeAhead: false,

    ...

});
0 голосов
/ 04 июля 2013

Просто используйте Ext.merge функцию

Из документа: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext-method-merge

...