2012-05-01 4 views
1

Я использую extjs 4.0.7. У меня есть требование, в котором у меня есть два поля со списком в режиме редактирования сетки, и мне нужно изменить данные во втором на основании значения, выбранного в первом.Как изменить данные в комбо на основе других данных, выбранных в extjs 4

Я использую архитектуру MVC для extjs и java-код, который возвращает строку json для заполнения данных в поле со списком. Код для моего первого комбо коробки:

вид файла:

items: [{ 
      id: 'country', 
      header: 'Countries', 
      field: { 
       xtype: 'combo', 
       store: [ 
        ["USA","USA"], 
        ["India","India"], 
       ], 
       editable: false, 
       allowBlank: false, 
       listeners: { 
        select: function(combo, records, eOpts){ 
         contactTypeGrid = combo.getValue(); 
         myGrid.fireEvent('LoadStateOnSelect'); 
        } 
       } 
      } 
     }, 
     { 
      id: 'states', 
      header: 'Sates', 
      dataIndex: 'states', 
      field: { 
       xtype: 'combo', 
       store: 'StateStore', 
       valueField: 'stateDesc', 
       displayField: 'stateText', 
      } 
     }, .... 
    ] 

контроллер:

LoadStateOnSelect: function(){ 
    contactTypeGrid = contactTypeGrid.toLowerCase(); 
    var stateStore = this.getStateStoreStore(); 
    stateStore.getProxy().url = "myURL.do"; 
    stateStore.getProxy().extraParams.act = contactTypeGrid; 
    stateStore.load(); 
}, 

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

Как устранить проблему загрузки условных данных? Любая помощь будет высоко ценится.

ответ

0

Вы пытались очистить выбранное значение в выпадающем списке перед перезагрузкой магазина? Вы можете попробовать использовать метод clearValue() в комбо.

+0

Спасибо за ответ Арун. магазин.clearValue() не метод однако, я попробовал store.removeAll(), но это не поможет. Использование firebug во время отладки, я заметил, что, когда я делаю свой первый выбор в комбинированной стране и нажимаю триггер для состояний, выполняется запрос, и значения полностью загружаются. Однако, когда я повторяю этот процесс во второй раз, новый запрос не запускается, однако данные в состояниях меняются и появляется маска «Загрузка». Что это может означать? – Merc

+0

Плохо. store.clearValue() не метод, однако, компонентReference.clearValue() существует. Я пробовал это, но даже это не помогает. – Merc

+0

Я попытался воспроизвести это, но у меня не было проблем при перезагрузке магазина новыми данными. –

0

У меня есть временное решение для этого. Тем не менее, я все еще ищу решение, которое является более стабильным и работоспособным.

Решение: При изменении данных в зависимом хранилище вы можете развернуть поле со списком, которое правильно загружает новые данные.

LoadStateOnSelect: function(){ 
    contactTypeGrid = contactTypeGrid.toLowerCase(); 
    var stateStore = this.getStateStoreStore(); 
    stateStore.getProxy().url = "myURL.do"; 
    stateStore.getProxy().extraParams.act = contactTypeGrid; 
    statesCombo.expand(); //Here I am assuming that "statesCombo" has a 
         //reference to the dependant combo box. 
    stateStore.load(); 
}, 

Это может спасти чью-то время, однако, в случае кто-то находит более эффективное решение, пожалуйста, дайте мне знать, как хорошо.

+0

Hey Merc .expand() работает как быстрое решение ... Вы нашли постоянное исправление? – SJG

0

carStore - любой магазин для главного комбо
carModelStore - магазин, содержание которого должно быть зависело от выбора в carStore

Рассмотрим более общий и полезный пример, когда данные получают с сервера.

var carModelStore = new Ext.data.Store({ 
    reader: new Ext.data.JsonReader({ 
     fields: ['id', 'car-model'], 
     root: 'rows' 
    }), 
    storeId: 'car-model-store', 
    proxy: new Ext.data.HttpProxy({ 
     url: 'carmodeldataprovider.json?car-name=lamborghini' 
    }), 
    autoLoad: true 
}); 


{ xtype: 'combo', name: 'car-name', fieldLabel: 'Car', mode: 'local', store: carStore, triggerAction: 'all', 
    listeners: { 
     select: function(combo, records, eOpts){ 
      var carName = records.get('car-name'); 
      var carModelStore = Ext.StoreMgr.lookup("car-model-store"); 

      carModelStore.proxy.setUrl('carmodeldataprovider.json?car-name=' + carName, false); 
      carModelStore.reload(); 
     } 
    } 

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