2010-09-21 5 views
1

У меня есть небольшая проблема. При моем применении Im всегда строит два связанных поля - страны и города (тогда выбираются страны - города начали загружаться). Итак, я подумал - мб написать конструктор и свести к минимуму мой код? Хорошо, я сделал это. Но у меня проблема: у меня есть 2-3 пары связанных ссылок на странице, и когда я выбрал вторую комбо-страну, данные (города) загружаются с первой комбо, потому что у нее одинаковый идентификатор. Хорошо - теперь я пытаюсь взять параметр id для конструктора, и он не работал. Как установить идентификатор combobox, тогда я создаю объект?ExtJS: Как установить идентификатор combobox?

Страна комбо

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);}}) 

И город комбо

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);}}) 

новый comboTownClass ({town_name_id: 'townFormSearch'})

новый comboCountryClass ({town_name_id: 'townFormSearch'})

+1

Посмотрите этот скринкаст: http://tdg-i.com/392/ext-js-screencast-the-dangers-of-ext-getcmp для некоторых подсказок (не) с использованием идентификаторов компонентов. – Mchl

ответ

2

Вы можете установить идентификатор компонента, выполнив следующие действия:

новый comboTownClass ({ID: 'townComboId'}); новый comboCountryClass ({id: 'countryComboId'});

Вы можете указать идентификатор по умолчанию, а при передаче идентификатора в параметре конфигурации он будет перезаписывать значение по умолчанию.

Хотя я согласен с этапом @Upper, вы должны попытаться ограничить количество жестко заданных значений id в форме - вместо этого вы можете вместо этого захватить элементы формы, используя имя формы.

1

Я живу по правилу: «никогда не используйте жестко установленные идентификаторы». Вы можете получить уникальный идентификатор из Ext JS с помощью

Ext.id(null, 'someTextString')

Вы понесете больше бухгалтерии при использовании уникальных идентификаторов, но вы не столкнетесь с проблемой, о которой вы пишете выше.

Иногда я храню уникальные идентификаторы локально в объекте, а затем при необходимости ссылаюсь на эту переменную экземпляра.

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

у вас решение (local - у меня есть код в одном .js-файле) comboTown правильно создан с уникальным идентификатором, но country combo вообще не отображается. какая проблема может быть здесь? –

+1

Я не вижу, где находится this.town_name_id. Поэтому я не могу быть уверен, что [id: this.town_name_id || «youuuu»] работает так, как вы ожидаете. Я также не вижу, где вы используете этот идентификатор. (Также следует проверить область действия этого в конструкторе ComboBox - возможно, хорошо). – Upperstage

Смежные вопросы