2010-11-18 7 views
13

Je voudrais savoir comment mettre à jour ou recharger les valeurs de liste d'un ComboBox ExtJs. Par exemple, j'ai quelques cases à cocher. Ces cases à cocher déterminent les valeurs que la ComboBox devrait avoir. Donc, après avoir sélectionné certains d'entre eux, je clique sur la liste drowndown (combobox) pour voir les valeurs.Mise à jour ou rechargement du magasin d'ExtJs ComboBox

En bref, comment puis-je modifier les valeurs (stockage) d'une ComboBox a déjà.

quelqu'un L'espoir peut me aider

Merci

+0

Est-ce une réponse résolu votre problème?Acceptez la meilleure réponse en cliquant sur la coche, s'il vous plaît. – Roberto

Répondre

0

Dans un écouteur d'événement sur les cases à cocher, obtenir une référence au magasin qui est en train de lire votre ComboBox. Puis appelez ses fonctions ajouter ou supprimer pour mettre à jour les données dans le magasin en fonction de la case à cocher checked Une fois les mises à jour terminées, appelez un doLayout() sur le composant ComboBox, il devrait se re-rendre en fonction de l'état actuel du magasin.

Bien que je pense qu'il existe un moyen de le mettre à jour automatiquement chaque fois que le magasin se met à jour - je ne l'ai pas encore utilisé.

+0

Pensez-vous qu'il est possible de mettre à jour la liste déroulante dans l'un de ses événements? Par exemple, je veux cliquer sur la liste déroulante (la flèche vers le bas), puis avant qu'elle ne s'affiche, une fonction obtient les valeurs en fonction des cases cochées. – user512514

+0

En fait, j'ai un gridPanel avec des cases à cocher. J'obtiens quelques valeurs des enregistrements obtenus par getSelections. Je voudrais trouver un moyen de faire ce processus une fois au lieu de le faire chaque fois que je sélectionne une ligne (ou cochez la case). C'est pourquoi j'ai eu l'idée de le faire en cliquant sur le ComboBox. – user512514

+0

Il est certainement possible de le faire dans les événements internes de la liste déroulante, d'étendre l'objet ComboBox et d'ajouter vos propres js avant d'appeler le gestionnaire d'événements du parent. Quant au gridPanel, c'est un peu difficile à conceptualiser sans le code. –

6

Il va un petit quelque chose comme ça

{ 
    xtype: 'checkbox', 
    //configs 
    listeners : { 
    checked : function (checkbox, checkedBool) { 
     var yourCombo = Ext.getCmp(yourComboID); 

     //I'm not sure what params you will need to reload the comboBox from your 
     // service but hopfully this will give the jist of things. . . 

     yourCombo.store.reload(
        { 
        params: 
         {yourParam : checkedBool}, 
         {yourRowID : rowID} 
        }); 
     } 
} 
14

Je me sers de cette fonction API ExtJs sans papier changer le magasin lors de l'exécution:

mycombobox.bindStore(newStore); 

comme indiqué par l'équipe de soutien à http://www.sencha.com/forum/showthread.php?40749-Change-Combobox-store-data-update .

Edit: Si je veux mettre les nouvelles données lorsque le magasin est rempli, je fais quelque chose comme ça

storeMyStore = new Ext.data.Store({ 
    ... 
    listeners: { 
     load: function(this, records, options) { 
      cbMyCombo.bindStore(storeMyStore); 
     } 
    } 
}); 
+0

Pas très "sans papiers" en fait, http://docs.sencha.com/extjs/4.2.5/#!/api/Ext.form.field.ComboBox-method-bindStore mais a fait l'affaire pour moi, Merci! –

+0

Oh, eh bien, c'était non documenté sur 2011 :) – Roberto

2

Ici, je fait un combobox qui est mis à jour après une sélection est faite sur un autre ComboBox. Fondamentalement, l'utilisateur final peut utiliser les deux comboboxes pour sélectionner une catégorie principale et une sous-catégorie, qui est basée sur la sélection faite sur la première combobox.

le magasin pour le premier comboBox:

Ext.define("StoreSubject", { 
extend: "Ext.data.Model", 
fields: [ 
{ 
    name: 'i_Id' 
}, 
{ 
    name: 's_Value' 
} 
] 
}); 

var StoreSubject = Ext.create('Ext.data.JsonStore', { 
model: 'StoreSubject', 
proxy: { 

    type: 'ajax', 
    url: '../General/AdministrationDefaultXMLDOM.aspx?qid=15', 
    reader: { 
     type: 'json' 
    } 
} 
}); 
StoreSubject.load(); 

C'est le magasin pour le deuxième comboBox:

Ext.define("StoreLanguageGroup", { 
extend: "Ext.data.Model", 
fields: [ 
{ 
    name: 'i_Id' 
}, 
{ 
    name: 's_Value' 
} 
] 
}); 
var StoreLanguageGroup = Ext.create('Ext.data.JsonStore', { 
model: 'StoreLanguageGroup', 
proxy: { 

    type: 'ajax', 
    url: '../General/AdministrationDefaultXMLDOM.aspx?qid=16', 
    reader: { 
     type: 'json' 
    } 
} 
}); 

Mon code pour Comobox est ressemble à ceci ..

Première ComboBox :

var cmbSubjectName = Ext.create('Ext.form.field.ComboBox', { 
id: 'cmbSubjectName', 
fieldLabel: '<b>Subject</b>', 
name: 'cmbSubjectName', 
valueField: 's_Value', 
displayField: 's_Value', 
allowBlank: false, 
anchor: '80%', 
labelWidth: 150, 
emptyText: '[--Choose--]', 
minChars: 0, 
store: StoreSubject, 
queryMode: 'local', 
typeAhead: true, 
listeners: { 
    'select': { 
     fn: function (combo, value) { 
      var strSubjectName = Ext.getCmp('cmbSubjectName').getValue(); 
      Ext.getCmp('cmbLanguageType').clearValue(); 
      Ext.getCmp('cmbLanguageType').getStore().load({ 
       params: { 
        SubjectName: strSubjectName 
       } 
      }); 
     } 
    } 

}, 
}); 

Ce code est utilisé pour appeler et remplacer le magasin Combox (Impuissant sinon il gardera sur le chargement)

Ext.override(Ext.LoadMask, { 
onHide: function() { 
    this.callParent(); 
} 
}); 

// -------------------- -------

ComboBox Deuxième:

var cmbLanguageType = Ext.create('Ext.form.field.ComboBox', { 
id: 'cmbLanguageType', 
fieldLabel: '<b>Language</b>', 
multipleSelect: false, 
name: 'cmbLanguageType', 
valueField: 's_Value', 
displayField: 's_Value', 
allowBlank: false, 
anchor: '80%', 
labelWidth: 150, 
emptyText: '[--Choose--]', 
minChars: 0, 
store: StoreLanguageGroup, 
queryMode: 'local', 
typeAhead: true, 
}); 

Espérons que cela vous aide .. et S'il vous plaît noter ma réponse

+0

Bienvenue sur [donc]! S'il vous plaît prendre un [tour]. – Unihedron