Как добавить пустой элемент в поле со списком ExtJS?
Я хочу добавить и удалить элемент (отображаемое значение пустое, высота элемента сохраняется как обычно) в Ext.form.ComboBox. Я ссылался на 2 ссылки ниже, чтобы настроить мой 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 (т.е. 3 элемента в элементах данных). И у combobox есть только 3 элемента (не 4, как я и ожидал).
У вас есть идеи о моей проблеме?!
Большое вам спасибо!
Ответы
Ответ 1
Поскольку вы добавляете значения 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
в поле со списком с
после поля отображения:
tpl: '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>',
(поле отображения fullName
в случае OPs)
Ответ 2
В начале можно добавить "пустую" запись:
listeners: {
load: function(store, records) {
store.insert(0, [{
fullName: ' ',
id: null
}]);
}
}
Ответ 3
Вот как мы можем добавить пустое поле в поле Combo
В java-карте или любой другой коллекции введите значение ключа, подобное этому
fuelMap.put(""," "); // we need to add " " not ""," " or null
// because these will add a fine blank line in Combobox
// which will be hardly noticeable.
В файле js он должен выглядеть примерно так:
Слушатель для комбинированного блока
listeners: {
select: function (comp, record, index) {
if (comp.getValue() === "" || comp.getValue() === " ") {
comp.setValue(null);
}
}
}
Ответ 4
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);
}
Ответ 5
В Ext 4.2.1 (возможно, другие) просто добавьте в конфигурацию combobox:
tpl : '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>'
Ответ 6
Если хранилище использует встроенные данные, тогда 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
}
},
}