2015-03-26 2 views
1

У меня есть два комбинированных блока: combo 1 и combo 2, которые заполняются двумя разными магазинами (скажем, хранилище 1 и хранилище 2). Значение в combo2 зависит от того, что выбрано в комбо 1. Затем я запрашиваю сервер, чтобы получить массив для combo2. Другими словами, мой выбор в combo1 определяет значения для combo2. Код, который я настроил, не работает и дает мне очень общую ошибку Error: Object doesn't support this action. Я вижу возвращаемые значения в отладчике браузера, поэтому я знаю его не мой запрос ajax. Я думаю, что я пропускаю что-то маленькое в поле со списком, которое сохраняет значения от отображения. Пожалуйста, смотрите ниже код, чтобы получить лучшее представление оДинамический магазин, не загружающий данные в поле со списком extjs

var store1 = Ext.create('Ext.data.ArrayStore', { 
    model: 'store1model', 
    autoLoad: true, 
    autoDestroy: true, 
    proxy: { 
    type: 'ajax', 
    url: 'backend.java' 
    extraParams: { 
     'param1': param1 
    }, 
    reader: { 
     type: 'json' 
    } 
} 
}); 

var store2 = Ext.create('Ext.data.ArrayStore', { 
    model: 'store2model', 
    autoLoad: true, 
    autoDestroy: true, 
    storeId: 'store2Id', 
    proxy: 'memory', 
    readre: { 
    type: 'json' 
    } 
}); 

var panel = Ext.create('Ext.form.Panel', { 
    title: 'Panel', 
    id: 'PanelId', 
    url: 'backened.java', 
    method: 'GET', 
    items: [{ 
    xtype: container, 
    layout: 'column', 
    items: [{ 
     xtype: 'container', 
     columnWidth: .5, 
     layout: 'anchor', 
     items: [{ 
     xtype: 'combobox', 
     fieldLabel: 'Combo1', 
     name: 'Combo1', 
     store: store1, 
     displayField: 'name', 
     valueField: 'name', 
     anchor: '96%', 
     listeners: { 
      select: function(combo, records) { 
      Ext.Ajax.request({ 
       url: 'backend.java', 
       method: 'GET', 
       params: { 
       "param2": combo.getValue() 
       }, 
       success: function(response) { 
       var data = Ext.Msg.decode(response.responseText); 
       store2.loadData(data); 
       } 
      }); 
      } 
     } 
     }, { 
     xtype: 'combobox', 
     fieldLabel: 'Combo2', 
     name: 'Combo2', 
     id: 'Combo2', 
     store: store2, 
     displayField: 'someField', 
     valueField: 'someField' 

     }] 

    }] 
    }] 


}); 

После некоторых поисков я нашел, может быть, я должен слушать изменения событий в combo2. Не уверен, что это правильно, и если это так, как это работает? Поэтому, я думаю, мой вопрос - две складки. Во-первых, почему этот код не работает? Во-вторых, есть ли лучший/более элегантный способ сделать это.

EDIT

var store2 = Ext.create('Ext.data.ArrayStore', { 
    model: 'store2model', 
    autoLoad: true, 
    autoDestroy: true, 
    storeId: 'store2Id', 
    proxy: { 
    type: 'ajax', 
    url: 'backend.java' 
    // extraParams: { 
    // 'param2': param2 
    // }, 
    reader: { 
     type: 'json' 
    } 

    } 
}); 

ответ

1

Похоже, вы назначили store1 прокси, так что вы можете сделать store1.load(), может попробовать сделать то же самое с store2.

Таким образом, вы можете назначить url 'backend.java' как прокси для store2, а когда combo1 будет выбран, вы можете загрузить хранилище для combo2 со значением, являющимся параметром.

{ 
     xtype: 'combobox', 
     fieldLabel: 'Combo1', 
     name: 'Combo1', 
     store: store1, 
     displayField: 'name', 
     valueField: 'name', 
     anchor: '96%', 
     listeners: { 
      select: function(combo, records) { 
      Ext.getCmp('Combo2').getStore().load({ 
       params: { 
        param2: combo.getValue() 
       } 
      }); 
      } 
     } 
     }, 

Это будет загружать магазин combo2 с параметром param2. Поэтому просто назначьте хранилище combo2 независимо от URL-адреса прокси-сервера. Попробуй это?

+0

Я пробовал это раньше, но когда я определяю прокси-сервер для store2 с помощью 'extraParams: { 'param2': param2 },' браузер вызывает ошибку, говоря, что параметр param2 не определен. Вот почему я сделал «Ajax.request» вручную. Извините, может быть, я должен был упомянуть об этом в вопросе. Это имеет смысл, потому что я еще не установил параметр param2. – Shay

+0

Я бы не объявил магазин дополнительными параметрами. Потому что в то время, когда вы объявляете в магазине, что дополнительный параметр еще не известен. Вместо этого попробуйте, как я показал, куда вы отправляете дополнительный параметр во время загрузки. Используя обозначение выше. Не объявляйте store2 с любыми дополнительными параметрами. Вам не нужно объявлять дополнительный параметр, чтобы отправить его вместе с ним во время загрузки. –

+0

Может быть, это мое отсутствие понимания прокси, но когда я устанавливаю 'store2' с прокси-сервером, я никогда не получаю ответа. Глядя на консоль, оказывается, что сервер никогда не получает параметр 'param2'. См. Редактирование для того, как я настроил 'store2' – Shay

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