Хранить содержимое с оставшимся прокси, указав неверный счет
ExtJS 5.1.x, с несколькими магазинами, использующими остальные прокси.
Вот пример:
Ext.define('cardioCatalogQT.store.TestResults', {
extend: 'Ext.data.Store',
alias: 'store.TestResults',
config:{
fields: [
{name: 'attribute', type: 'string'},
{name: 'sid', type: 'string'},
{name: 'value_s', type: 'string'},
{name: 'value_d', type: 'string'}
],
model: 'cardioCatalogQT.model.TestResult',
storeId: 'TestResults',
autoLoad: true,
pageSize: undefined,
proxy: {
url: 'http://127.0.0.1:5000/remote_results_get',
type: 'rest',
reader: {
type: 'json',
rootProperty: 'results'
}
}
}
});
Этот магазин заполняется, когда в API происходят определенные вещи. После того, как хранилище заполнено, мне нужно сделать некоторые основные вещи, такие как подсчет количества отдельных экземпляров атрибута, скажем, sid
, который я делаю следующим образом:
test_store = Ext.getStore('TestResults');
n = test_store.collect('sid').length);
Проблема в том, что мне нужно обновить браузер, чтобы получить правильное значение 'n', в противном случае счетчик не верен. Я делаю test_store.load()
и действительно, запрос отправляется на сервер после .load()
выпущен.
Я непосредственно запрашиваю базу данных бэкэнда, чтобы увидеть, какие данные есть в таблице, и получить счетчик для сравнения со значением, данным test_store.collect('sid').length);
, Странно то, что я также распечатываю объект хранилища в отладчике, и ожидаемые записи (по сравнению с содержимым в таблице базы данных) отображаются в data.items
массив, но значение, данное test_store.collect('sid').length
не является правильным.
Все это делается последовательно в обратном вызове успеха. Мне интересно, есть ли какое-то асинхронное поведение, дающее мне противоречивые результаты между тем, что такое магазин, и подсчетом содержимого магазина?
Я проверил это с другим магазином, который использует остальные прокси, и у него такое же поведение. С другой стороны, использование прокси-сервера localStorage дает правильное количество в соответствии с записями хранилища / экземплярами модели.
Вот соответствующий код, о котором идет речь, Ajax-запрос срабатывает и делает свое дело правильно, и выполняет этот успешный обратный вызов. Там действительно не очень много интересного происходит... проблемный раздел после console.log('TEST STORE HERE');
где я получаю хранилище, распечатываю содержимое хранилища, загружаю / синхронизирую, затем печатаю хранилище (которое работает просто отлично) и, наконец, печатаю длину уникально сгруппированных элементов по sid
атрибут (который не работает):
success: function(response) {
json = Ext.decode(response.responseText);
if(json !== null && typeof (json) !== 'undefined'){
for (i = 0, max = json.items.length; i < max; i += 1) {
if (print_all) {
records.push({
sid: json.items[i].sid,
attribute: json.items[i].attribute,
string: json.items[i].value_s,
number: json.items[i].value_d
});
}
else {
records.push({
sid: json.items[i].sid
})
}
}
//update store with data
store.add(records);
store.sync();
// only add to store if adding to search grid
if (!print_all) {
source.add({
key: payload.key,
type: payload.type,
description: payload.description,
criteria: payload.criteria,
atom: payload.atom,
n: store.collect('sid').length // get length of array for unique sids
});
source.sync();
}
console.log('TEST STORE HERE');
test_store = Ext.getStore('TestResults');
test_store.load();
test_store.sync();
console.log(test_store);
console.log(test_store.collect('sid').length)
}
// update grid store content
Ext.StoreMgr.get('Payload').load();
Ext.ComponentQuery.query('#searchGrid')[0].getStore().load();
}
Для полноты, вот вывод массива data.items items:Array[2886]
что эквивалентно количеству уникальных предметов, сгруппированных по атрибуту sid
и, наконец, вывод console.log(test_store.collect('sid').length)
, который дает значение из ПРЕДЫДУЩЕГО запуска этого: 3114
...