ExtJS 5.1.x,有几个商店使用rest proxy。
以下是一个例子:
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
数组下,但{{1}给出的值不对。
这是在成功回调中按顺序完成的。我想知道是否存在某种异步行为,这使得我在商店的内容和商店内容的数量之间存在不一致的结果?
我用另一个使用rest代理的商店测试了它,它具有相同的行为。另一方面,使用localStorage代理可以提供与商店记录/模型实例一致的正确计数。
这是相关的相关代码,Ajax请求会触发并正确执行其操作,并点击此成功回调。真的没有什么有趣的...问题部分是在test_store.collect('sid').length
之后我到达商店,打印商店的内容,加载/同步然后打印商店(它只是工作罚款)然后最后按console.log('TEST STORE HERE');
属性打印唯一分组项目的长度(这是不起作用的):
sid
为了完整性,这里是data.items数组输出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();
}
这是按属性items:Array[2886]
分组的唯一项目的等效计数,最后是sid
的输出,它提供了上一次运行的值:console.log(test_store.collect('sid').length)
...