如何在两个商店之间共享一个AJAX呼叫?
问题描述:
我有两个Sencha/ExtJS4网格使用完全相同的数据(即相同的store.proxy.url),但每个使用不同的过滤器,所以每个都有自己的独立存储。问题是我正在做一个不必要的AJAX调用来检索额外的副本。如何在两个商店之间共享一个AJAX呼叫?
对于独立过滤,建议进行单个AJAX调用,然后在两个存储之间共享数据的建议方法是什么?
可能的解决方案:
- 创建扩展的同店两班?
- 使用相同的代理实例吗?
- 检索一个商店,然后克隆它?
答
Ext JS 4框架似乎是以每个视图都有自己的存储为目的而构建的。正如其他答案中所述,您最好的选择是创建第二个存储并将所有记录从一个存储到另一个存储。
function cloneStore(src, dest) {
var recs = src.getRange(); // returns array of records
dest.loadRecords(recs); // removes existing records before batch add
}
该功能的确切实现可能会有所不同,这取决于您需要如何分散数据。如果每个网格仅需要开始的数据子集,则可以从Ajax调用初始化主存储,然后直接在store.data混合聚合上使用过滤器创建两个子存储。
// Note: This function isn't exactly "good practice"
// Actual implementation may vary
function populateSubStores(master, storeA, storeB) {
var dataA = master.data.filter(/* filter criteria for store A */),
dataB = master.data.filter(/* filter criteria for store B */);
// dataA and dataB are MixedCollections of records
storeA.loadRecords(dataA.getRange());
storeB.loadRecords(dataB.getRange());
}
或其一些变化。这应该足以让你开始正确的方向。
如果你真的很喜欢,你可以创建一个新类型的商店,它维护代表不同视图的过滤器状态的单独的混合集合,然后返回每个过滤器状态作为具有相同接口的商店,但具有实现它根据“主”商店的内部表示进行操作,以便现有视图可以在没有覆盖的情况下运行。但我不推荐它。
答
您可以创建一个店铺的两个实例,然后就从一个存储中复制数据到另一个使用getRange()
和add()
方法。创建两个类似乎不合理。
我个人会克隆商店。如果您不必同时显示两个不同的结果,您还可以使用过滤器(设置/取消设置/重置)中的一部分来获取理想的结果。 – ted 2012-04-06 13:23:32