web-dev-qa-db-fra.com

Comment ajouter un élément vide à la liste déroulante ExtJS?

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}&nbsp;</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!

17
Đinh Hồng Châu

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 &nbsp; après le champ d’affichage:

tpl: '<tpl for="."><div class="x-boundlist-item">{fullName}&nbsp;</div></tpl>',

(le champ d'affichage est fullName dans le cas des OP)

9
Geronimo

Vous pouvez ajouter un enregistrement "vide" au début:

 listeners: {
     load: function(store, records) {
          store.insert(0, [{
              fullName: '&nbsp;',
              id: null
          }]);
     }
  }
14
Darin Kolev

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("","&nbsp;"); // we need to add "&nbsp;" 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() === "&nbsp;") {
            comp.setValue(null);
        }
    }
}
3
ifti
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}&nbsp;</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);
}
3
wens

Dans Ext 4.2.1 (probablement d'autres), ajoutez simplement à confobox config:

tpl : '<tpl for="."><div class="x-boundlist-item">{fullName}&nbsp;</div></tpl>'
2
Black

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
        }
    },
}
0
serg