У меня есть два комбинированных блока: 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'
}
}
});
Я пробовал это раньше, но когда я определяю прокси-сервер для store2 с помощью 'extraParams: { 'param2': param2 },' браузер вызывает ошибку, говоря, что параметр param2 не определен. Вот почему я сделал «Ajax.request» вручную. Извините, может быть, я должен был упомянуть об этом в вопросе. Это имеет смысл, потому что я еще не установил параметр param2. – Shay
Я бы не объявил магазин дополнительными параметрами. Потому что в то время, когда вы объявляете в магазине, что дополнительный параметр еще не известен. Вместо этого попробуйте, как я показал, куда вы отправляете дополнительный параметр во время загрузки. Используя обозначение выше. Не объявляйте store2 с любыми дополнительными параметрами. Вам не нужно объявлять дополнительный параметр, чтобы отправить его вместе с ним во время загрузки. –
Может быть, это мое отсутствие понимания прокси, но когда я устанавливаю 'store2' с прокси-сервером, я никогда не получаю ответа. Глядя на консоль, оказывается, что сервер никогда не получает параметр 'param2'. См. Редактирование для того, как я настроил 'store2' – Shay