#json #ajax #extjs #combobox
#json #ajax #extjs #поле со списком
Вопрос:
Я использую Extjs 5.1 для заполнения поля со списком данными, возвращенными из вызова AJAX.
Вызов AJAX возвращает названия продуктов, но поле со списком заполняет данные в одной строке через запятую (требуется заполнить элементы в отдельной строке одним элементом в каждой строке).
Логика поля со списком
{
xtype: 'combo',
queryMode: 'remote',
itemId: 'prodListCombo',
name: 'prodNumber',
emptyText: '-- Select Product --',
width: '290px',
height: '32px',
autoSelect: false,
enableKeyEvents: true,
selectOnFocus: false,
minChars: 1,
padding: '0 0 0 5',
listConfig: {
maxHeight: 110,
emptyText: 'No Products found.'
},
triggerAction: 'all',
displayField: 'prodNumber',
store: productStore,
editable: false,
typeAhead: false,
forceSelection: true,
dataIndex: 'prodNumber',
lastQuery: '',
listeners: {
click: function(grid, rowIndex, colIndex) {
},
beforequery: function(queryPlan, eOpts) {
var prodInstore = "";
var prodInstoreArrray = [];
//MMACMF-74
Prod_Num = Ext.ComponentQuery.query('#prodListCombo')[0];
Ext.Ajax.request({
url: MaintenanceAdvisor.util.AppUrls.appurls.getCustomerProds,
method: 'GET',
params: {
"customerName": 'CUST A'
},
success: function(response) {
debugger;
var response2 = Ext.decode(response.responseText);
var datafiles = response2.data; ** -- > datafiles has the data of PROD A and PROD B. **
if (datafiles.length === 0) {
} else {
store.removeAll();
store.add(datafiles);
Ext.ComponentQuery.query("#prodListCombo")[0].setValue(store.getData('prodNumber').items);
for (var iProd = 0; iProd < datafiles.length; iProd ) {
var ProdId = store.getAt(iProd).data.prodNumber;
prodInstore = ProdId;
prodInstore = ',';
}
prodInstore = prodInstore.substr(0, prodInstore.length - 1);
prodInstoreArrray = prodInstore.split(",");
//Ext.ComponentQuery.query("#prodListCombo")[0].setValue(prodInstoreArrray);
}
},
failure: function(response) {
alert("failed");
}
});
} //beforequery
} //listeners
},
Ответ JSON
datafiles: Array(2)
0:
id: "CustomerCenter-31"
customerName: null
customerType: "OPERATOR"
**productNumber: "PROD A"**
__proto__: Object
1:
id: "CustomerCenter-32"
customerName: null
customerType: "OPERATOR"
**productNumber: "PROD B"**
__proto__: Object
length: 2
Java-код возвращает Map для запроса вызова AJAX.
Но данные в поле со списком разделены запятыми.
Пожалуйста, сообщите мне о любых изменениях в скрипте, чтобы заполнить его в каждой строке.
Спасибо Ramm
Ответ №1:
Ваш код немного запутанный, но я вижу, что вы использовали некоторые ненужные подходы, такие как beforequery
событие, цикл для монтирования массива и так далее. Я предложу другой подход, более соответствующий возможностям фреймворка.
Поскольку ваше поле со списком editable: false
, используйте select
событие вместо beforequery
вызова второго поля со списком для заполнения. Чтобы заполнить его, вместо использования Ext.Ajax.request
напрямую, может быть интереснее настроить proxy.api хранилища и использовать внешние данные.Store.html метод загружает событие после установки параметра, выбранного в первом поле со списком. Хранилище должно иметь связанное с ним model
или fields
свойство, заполненное теми же свойствами, что и возвращенный JSON.
Я использовал Jakeplaceholder Fake Online REST API для настройки примера:
Ext.application({
name : 'Fiddle',
launch : function() {
var firstStore = Ext.create('Ext.data.Store', {
proxy: {
type: 'ajax',
api: {
read: 'https://jsonplaceholder.typicode.com/albums'
}
},
fields: [
{ name: 'id' },
{ name: 'title' }
]
});
var secondStore = Ext.create('Ext.data.Store', {
proxy: {
type: 'ajax',
api: {
read: 'https://jsonplaceholder.typicode.com/photos'
}
},
fields: [
{ name: 'id' },
{ name: 'title' }
]
});
Ext.create('Ext.window.Window', {
title: 'Test Ajax Combobox',
layout: 'form',
maximized: true,
items: [
{
xtype: 'combobox',
label: 'First Combo',
editable: false,
valueField: 'id',
displayField: 'title',
store: firstStore,
listeners: {
select: function(field, record, e){
field.next().reset();
alert('Selected a new item on first combobox store.');
field.up('window').mask('Wait...');
secondStore.load({
params: {
albumId: record.get('id')
},
callback: function(){
field.up('window').unmask();
alert('Arrived the response of the request and automatically filled the second combobox store.');
}
});
// Or...
// secondStore.getProxy().setExtraParam('albumId', record.get('id'));
// secondStore.reload({
// callback: function(){
// field.up('window').unmask();
// alert('Arrived the response of the request and automatically filled the second combobox store.');
// }
// });
}
}
},
{
xtype: 'combobox',
editable: false,
label: 'Second Combo',
store: secondStore,
valueField: 'id',
displayField: 'title'
}
]
}).show();
}
});
Ознакомьтесь с документом по ссылкам.
По любым вопросам оставляйте комментарий. Я надеюсь, что это поможет.
Комментарии:
1. Мне нравится этот подход, но я не могу использовать этот способ в своем проекте. Спасибо 🙂