Extjs4 如何在两个商店之间共享一个AJAX调用?

Extjs4 如何在两个商店之间共享一个AJAX调用?,extjs4,store,Extjs4,Store,我有两个Sencha/ExtJS4网格,它们使用完全相同的数据(即,相同的store.proxy.url),但每个网格使用不同的过滤器,因此每个网格都有自己的单独存储。问题是我正在进行一个不必要的AJAX调用来检索要处理的额外副本 建议采用什么方法进行单个AJAX调用,然后在两个存储区之间共享数据以进行独立过滤 可能的解决办法: 创建两个扩展同一存储的类 是否使用相同的代理实例 检索一个存储然后克隆它 您可以创建一个存储的两个实例,然后使用getRange()和add()方法将数据从一个存储复

我有两个Sencha/ExtJS4网格,它们使用完全相同的数据(即,相同的store.proxy.url),但每个网格使用不同的过滤器,因此每个网格都有自己的单独存储。问题是我正在进行一个不必要的AJAX调用来检索要处理的额外副本

建议采用什么方法进行单个AJAX调用,然后在两个存储区之间共享数据以进行独立过滤

可能的解决办法:

  • 创建两个扩展同一存储的类
  • 是否使用相同的代理实例
  • 检索一个存储然后克隆它

您可以创建一个存储的两个实例,然后使用
getRange()
add()
方法将数据从一个存储复制到另一个存储。创建两个类似乎不合理。

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 MixedCollection上使用过滤器创建两个子存储

// 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());
}
或其一些变体。这应该足以让你朝着正确的方向开始


如果你真的很努力,你可以创建一种新的存储类型,它维护不同视图中表示过滤器状态的单独混合集合,然后将每个过滤器状态作为一个存储返回,该存储具有与
Ext.data.store
相同的接口,但其实现在“master”上运行存储的内部表示形式,以便现有视图可以在没有替代的情况下运行。但我不推荐。

我个人会克隆这家商店。您还可以使用过滤器(设置/取消设置/重置)来检索所需的结果,前提是您不必同时显示两个不同的结果。