web-dev-qa-db-fra.com

Comment obtenir l'index sélectionné d'une Combobox ExtJS

Quelle est la méthode certifiée pour déterminer l'index de l'élément actuellement sélectionné dans une zone de liste déroulante dans ExtJS?

Y a-t-il une différence sur la façon de procéder entre ExtJS 3.x et 4?

var combo = new Ext.form.ComboBox(config);
var selectedIndex = combo.selectedIndex; // TODO: Implement
if(selectedIndex > 2) {
    // Do something
}

Points bonus pour l'ajouter en tant que propriété à l'objet ComboBox.

20
Seb Nilsson

Je pense que vous devrez utiliser le magasin du combo pour cela. Les combos ont une méthode privée findRecord qui fera une recherche simple sur le magasin par propriété et valeur. Vous pouvez voir un exemple dans le code source lui-même (ligne Combo.js 1119).

1) Sur cette base, vous pouvez trouver l'index sélectionné de cette façon:

var v = combobox.getValue();
var record = combobox.findRecord(combobox.valueField || combobox.displayField, v);
var index = combobox.store.indexOf(record);

2) Ou vous pouvez vous lier à l'événement "select" qui est déclenché avec le combo, l'enregistrement sélectionné et son index comme paramètre.

3) Vous pouvez également accéder à la vue getSelectedIndexes () mais je doute que ce soit une bonne solution (en ce sens que je ne suis pas sûr qu'elle soit disponible tout le temps)

Enfin, si vous souhaitez étendre l'objet combobox, je pense que cela devrait fonctionner (si vous optez pour la première solution):

Ext.override(Ext.form.ComboBox({
  getSelectedIndex: function() {
    var v = this.getValue();
    var r = this.findRecord(this.valueField || this.displayField, v);
    return(this.store.indexOf(r));
  }
});
36
Jad

Dans Ext 4.0.2, le même code ressemblerait à:

Ext.override(Ext.form.ComboBox, {
  getSelectedIndex: function() {
    var v = this.getValue();
    var r = this.findRecord(this.valueField || this.displayField, v);
    return(this.store.indexOf(r));
  }
});

Jad, vous manquez une parenthèse fermante sur votre déclaration de retour ... pensais juste que vous devriez savoir.

4
SerEnder

Si vous avez un combo où valueField est l'identifiant utilisé par le magasin du combo, vous pouvez simplement éviter la recherche:

var v = combobox.getValue();
var record = combobox.findRecord(combobox.valueField || combobox.displayField, v);
var index = combobox.store.indexOf(record);

en utilisant ceci:

var id = combobox.getValue();
var record = store_combobox.getById(id);
2