2010-09-21 16 views
1

J'ai un petit problème. A mon application Im toujours construire deux combobox liés - pays et villes (alors le pays est sélectionné - les villes ont commencé à charger). Alors j'ai pensé - mbe écrire un constructeur et minimisé mon code? Ok je l'ai fait. Mais j'ai un problème: j'ai 2-3 paires de comboboxes liées sur la page et quand j'ai sélectionné au deuxième pays combo, les données (villes) se chargent au premier combo, parce qu'il a le même id. Ok - maintenant j'essaye de prendre un identifiant de param au constructeur et cela n'a pas fonctionné. Comment définir id de combobox alors je crée un objet?ExtJS: Comment définir l'identifiant combobox?

combo Pays

comboCountryClass = Ext.extend(Ext.form.ComboBox, { 
      fieldLabel: 'country', 
      anchor: '95%', 
      lazyRender:true, 
      store:new Ext.data.Store({ 
        proxy: new Ext.data.HttpProxy(
        {url: '../lib/getRFB.php?rfb_type=countrys', 
        method: 'GET'} 
       ), 
        reader: countryReader, 
        autoLoad: true 
      }), 
      displayField:'country_name', 
      valueField:'country_id', 
      triggerAction:'all', 
      mode:'local', 
      listeners:{ 
       select:{ 
        fn:function(combo, value) { 
         var modelCmp = Ext.getCmp(this.town_name_id); 
         alert(this.town_name_id); 
         modelCmp.setValue(''); 
         modelCmp.getStore().proxy.setUrl('../lib/getRFB.php'); 
         modelCmp.store.reload({ 
          params: { 'country_id': this.getValue(),rfb_type: 'towns' } 
         }); 
        } 
       } 
      }, 
      hiddenName:'country_id', 
      initComponent: function() {comboCountryClass.superclass.initComponent.call(this);}}) 

Et combo ville

comboTownClass = Ext.extend(Ext.form.ComboBox, { 
      fieldLabel:'town', 
      displayField:'town_name', 
      valueField:'town_id', 
      hiddenName:'town_id', 
      anchor: '95%', 
      id:this.town_name_id || 'youuuu', 
      store: new Ext.data.Store({ 
        proxy: new Ext.data.HttpProxy( 
        {url: 'lib/handlers/orgHandler.php?action=read&towns=true', 
        method: 'GET'} 
       ), 
        reader: townReader 
      }), 
      triggerAction:'all', 
      mode:'local', 
      initComponent: function() {comboTownClass.superclass.initComponent.call(this);}}) 

nouvelle comboTownClass ({town_name_id: 'townFormSearch'})

nouvelle comboCountryClass ({town_name_id: 'townFormSearch'})

+1

Voir ce screencast: http://tdg-i.com/392/ext-js-screencast-the-dangers-of-ext-getcmp pour quelques conseils sur (ne pas) utiliser les identifiants de composants. – Mchl

Répondre

2

Vous pouvez définir l'identifiant du composant en procédant comme suit:

nouveau comboTownClass ({id: 'townComboId'}); nouvelle comboCountryClass ({id: 'countryComboId'});

Vous pouvez spécifier un ID par défaut et lorsque vous transmettez un ID dans le paramètre config, il écrase la valeur par défaut.

Bien que je sois d'accord avec @Upper Stage, vous devriez essayer de limiter la quantité de valeurs d'id codées en dur que vous avez dans le formulaire - vous pouvez plutôt récupérer des éléments de formulaire en utilisant le nom du formulaire.

-1
myCombobox.id = yourId; 
1

Je vis selon la règle: "n'utilisez jamais d'ID codés en dur". Vous pouvez récupérer un identifiant unique de Ext JS en utilisant

Ext.id(null, 'someTextString')

Vous encourrez plus tenue de livres lorsque vous utilisez des identifiants uniques, mais vous ne rencontrerez pas le problème sur lequel vous écrivez ci-dessus.

Parfois, je stocke localement des identifiants uniques dans un objet, puis référence cette variable d'instance si nécessaire.

this.idForCombo = Ext.id(null, 'someTextString'); 
var myCmp = new SomeConstructor({ 
    id: this.idForCombo, 
    ...more stuff }); 
+0

à votre solution (local - j'ai le code dans un fichier .js) comboTown correctement créé avec l'ID unique, mais le combo de pays ne semble pas cet ID du tout. quel problème peut être ici? –

+1

Je ne vois pas où this.town_name_id est défini. Donc, je ne peux pas être certain que [id: this.town_name_id || 'youuuu'] fonctionne comme prévu. Je ne vois pas non plus où vous utilisez cet identifiant. (Aussi devrait vérifier la portée de ceci dans votre constructeur ComboBox - probablement ok.) – Upperstage