ExtJS存储 - 只加载一次JSON

时间:2014-01-22 09:23:39

标签: javascript json extjs

我有多个商店需要使用不同rootProperty的相同JSON文件。是否有可能加载json文件一次并用它填充所有商店?截至目前,具有三个不同rootProperties的三个商店导致三次调用服务器,以获取包含数据的可能兆字节大小的JSON文件,并为每个请求反复生成。

json看起来像:

{"users":[{"id":0,"name":"John Doe",...},...],
 "threads":[{"id":0,"startedBy":0,"lastPost":0,...},...],
 "posts":[...]}

三家商店非常相似,一个例子:

store: {
    model: 'Forum.model.Post',
    autoLoad: true,
    proxy:{
        type: 'ajax'
        url: '../api/json.php'
        reader: {
            type:'json'
            rootProperty:'posts'
        }
    }
}

2 个答案:

答案 0 :(得分:7)

您可以使用内存代理配置商店:

store: {
    model: 'Forum.model.Post',
    proxy:{
        type: 'memory'
        reader: {
            type: 'json'
            root: 'posts'
        }
    }
}

然后使用Ext.Ajax.request获取数据并使用代理将其加载到每个商店中:

Ext.Ajax.request({
    url: '../api/json.php',
    success: function(response) {
        var result = Ext.JSON.decode(response.responseText);

        store.getProxy().data = result;
        store.load();
        // same procedure for the other stores...
    }
});

答案 1 :(得分:2)

(基本上是Evan所说的)在你的商店设置“autoLoad:false”。在控制器中,执行手动Ext.Ajax.request以获取大型JSON对象。对于每个商店,手动调用store.loadRawData()并将该JSON对象作为第一个参数传递。

这种方法比仅使用内存代理有一个优势:一旦你加载了数据,你的每个商店都会继续通过代理与服务器进行通信。