Je souhaite ajouter et vider un élément (la valeur d'affichage est vide, la hauteur de l'élément est conservée normalement) dans un fichier Ext.form.ComboBox. J'ai référé 2 liens ci-dessous pour configurer ma liste déroulante, mais il n'affiche toujours pas l'élément vide:
Voici mon code:
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>'
});
Les données de la liste déroulante seront chargées après une demande Ajax (c.-à-d. 3 éléments dans les éléments de données). Et la liste déroulante ne contient que 3 éléments (et non 4 comme prévu). Avez-vous une idée de mon problème?! Merci beaucoup!
Depuis que vous ajoutez les valeurs de la liste déroulante plus tard, pourquoi ne pas simplement initialiser le magasin avec une valeur vide:
store : new Ext.data.JsonStore({
fields : ['id', 'fullName'],
data : [{id: 0, fullName: ''}]
}),
Plus tard, quand vous ferez store.add(theRestOfThem)
, ce vide sera toujours là.
Il a fallu y revenir aujourd'hui (15 avril 2017) pour ExtJS 4.2:
Le moyen le plus simple consiste à inclure une chaîne vide dans le magasin, comme ci-dessus. Vous pouvez également le faire avec un écouteur de chargement dans le magasin:
listeners:
{
load: function(store, records)
{
store.insert(0, [{
fullName: '',
id: null
}]);
}
}
Ajoutez ensuite une configuration tpl
à la liste déroulante avec
après le champ d’affichage:
tpl: '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>',
(le champ d'affichage est fullName
dans le cas des OP)
Vous pouvez ajouter un enregistrement "vide" au début:
listeners: {
load: function(store, records) {
store.insert(0, [{
fullName: ' ',
id: null
}]);
}
}
Voici comment nous pouvons ajouter un champ vide dans la liste déroulante.
Dans Java Map ou dans toute autre collection, mettez une valeur de clé comme celle-ci.
fuelMap.put(""," "); // we need to add " " not ""," " or null
// because these will add a fine blank line in Combobox
// which will be hardly noticeable.
Dans fichier js , cela devrait être comme ceci:
Auditeur pour la liste déroulante
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>';
}
}
});
en initialisant le composant, vous pouvez faire ceci (sur le contrôleur):
populateMyComboBox([yourComboBoxComponent], true);
sur la fonction de peuplement:
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);
}
Dans Ext 4.2.1 (probablement d'autres), ajoutez simplement à confobox config:
tpl : '<tpl for="."><div class="x-boundlist-item">{fullName} </div></tpl>'
Si le magasin utilise des données en ligne, store.load
ne se déclenchera même pas. Peut-être y a-t-il une meilleure solution, mais j'ai fini par insérer des enregistrements de magasin sur 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
}
},
}