Как добавить пустой элемент в ExtJS combobox?
Я хочу добавить и пустой элемент (значение отображения пустое, высота элемента сохраняется как обычно) в Ext.форма.комбинированный список. Я ссылался на 2 ссылки ниже, чтобы настроить мой combobox, но он все еще не отображает пустой элемент:
- http://www.ashlux.com/wordpress/2009/09/04/handling-empty-options-with-ext-js-combo-box/
- http://www.sencha.com/forum/showthread.php?52340-How-to-add-a-quot-blank-quot-entry-to-a-ComboBox
вот мой код:
this.abcCombo = new Ext.form.ComboBox({
    name : 'abcCombo',
    hiddenName : 'abcCombo-id',
    fieldLabel : "My Combobox",
    width : 250,
    editable : false,
    forceSelection : true,
    mode : 'local',
    triggerAction : 'all',
    valueField : 'id',
    displayField : 'fullName',
    store : new Ext.data.JsonStore({
        fields : ['id', 'fullName']
    }),
    tpl : '<tpl for="."><div class="x-combo-list-item">{fullName} </div></tpl>'
});
данные хранилища combobox будут загружены после запроса Ajax (i.e 3 элемента в элементах данных). И у combobox есть только 3 элемента (а не 4, Как я ожидал). Ты хоть представляешь, в чем моя проблема?! Большое вам спасибо!
6 ответов
поскольку вы добавляете значения combobox позже, почему бы просто не инициализировать магазин одним пустым значением:
store : new Ext.data.JsonStore({
    fields : ['id', 'fullName'],
    data : [{id: 0, fullName: ''}]
}),
позже, когда вы делаете store.add(theRestOfThem), что пустым останется.
пришлось пересмотреть это сегодня (15 апреля 2017) для ExtJS 4.2:
самый простой способ-включить пустую строку в хранилище, как указано выше, это также можно сделать с помощью прослушивателя загрузки в магазине:
listeners: 
{
    load: function(store, records) 
    {
        store.insert(0, [{
            fullName: '',
            id: null
        }]);
    }
}
добавить tpl config в combobox с   после отображения поля:
tpl: '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>',
(отображаемое поле fullName в случае OPs)
вы можете добавить "пустую" запись в начале:
 listeners: {
     load: function(store, records) {
          store.insert(0, [{
              fullName: ' ',
              id: null
          }]);
     }
  }
Это, как мы можем добавить пустое поле в поле со списком
в java Map или любой другой коллекции поместите значение ключа, подобное этому
fuelMap.put(""," "); // we need to add " " not ""," " or null 
                          // because these will add a fine blank line in Combobox 
                          // which will be hardly noticeable.
на Яш, это должно быть так:
прослушиватель для поля со списком
listeners: {
    select: function (comp, record, index) {
        if (comp.getValue() === "" || comp.getValue() === " ") {
            comp.setValue(null);
        }
    }
}
this.abcCombo = new Ext.form.ComboBox({
    name : 'abcCombo',
    hiddenName : 'abcCombo-id',
    fieldLabel : "My Combobox",
    width : 250,
    editable : false,
    forceSelection : true,
    mode : 'local',
    triggerAction : 'all',
    valueField : 'id',
    displayField : 'fullName',
    store : new Ext.data.JsonStore({
       fields : ['id', 'fullName']
    }),
    tpl : '<tpl for="."><div class="x-combo-list-item">{fullName} </div></tpl>'
    //make sure to add this
    //if not added, empty item height is very small
    listConfig : {
        getInnerTpl: function () {
            return '<table><tr><td height="12">{fullName}</td></tr></table>';
        }
    }
});
при инициализации компонента вы можете сделать это (на контроллере):
populateMyComboBox([yourComboBoxComponent], true);
о функции заполнения:
populateMyComboBox : function(comboBox, insertEmpty) {
    var list;
    if (insertEmpty) {
        list.push({id : 0, fullName : ''});
    }
    var mStore = Ext.create('Ext.data.Store', {
        fields: ['data', 'label'],
        data : list.concat([real_data])
    }),
    comboBox.bindStore(mStore);
}
в Ext 4.2.1 (возможно, другие) просто добавьте в конфигурацию combobox:
tpl : '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>'
Если магазин использует встроенные данные затем store.load даже не уволит. Возможно, есть лучшее решение, но я закончил вставкой записей магазина на combobox.render:
{
    xtype: 'combo',
    displayField: 'name',
    valueField: 'value',
    store: {
        type: 'MyInlineStore',
    },
    listeners: {
        render: function(el){
            el.getStore().insert(0, [{name: '[Any]', value: ''}]);
            el.setValue(''); //select [Any] by default
        }
    },
}
