如何从get请求创建多个JSON存储?

时间:2011-09-03 15:52:38

标签: javascript json extjs extjs4

假设我在客户端使用extjs4和服务器端的Zend框架操作控制器构建了这个Web应用程序。我在服务器端有数组数组,它​​们可以作为JSON输出到客户端。当我想只创建一个商店时,通常的方式就是这样:

    Ext.define('MA.store.AdminResources', {
extend : 'Ext.data.Store',
fields : [ {
    name : 'id'
}, {
    name : 'name'
} ],
autoLoad : true,
proxy : {
    type : 'ajax',
    url : './account/adminresources',
    reader : {
        type : 'json'
        //,root : 'users'
    }
}

});

如果我想从一个http请求到服务器创建多个JSON存储怎么办? 此服务器不会在每个商店收到远程代理请求,并且将为所有商店执行一个请求。 以下是服务器返回的JSON示例:

{
"adminsettings"{"userid":3333,"primaryemail":"1@1.com","firstname":"","middlename":null}
,"countries":{"AD":"Andorra","AE":"UnitedArabEmirates","AF":"Afghanistan"...}
,"languages":{"aa":"Afar","ab":"Abkhazian","ace":"Achinese","ach":"Acoli"...
}}

如何只使用一个http请求创建管理员设置,国家/地区,语言的JSON商店? 也许我需要定义一个代理和3个读者?!

2 个答案:

答案 0 :(得分:5)

正如您在文档中看到的那样,您可以定义不带代理的商店:

Ext.create('Ext.data.Store', {
    model: 'User',
    data : [
        {firstName: 'Ed',    lastName: 'Spencer'},
        {firstName: 'Tommy', lastName: 'Maintz'},
        {firstName: 'Aaron', lastName: 'Conran'},
        {firstName: 'Jamie', lastName: 'Avins'}
    ]
});

然后很容易制作ajax请求和onSuccess手动加载数据:

这样的事情:

adminSettings = Ext.create('Ext.data.Store', {model: AdminSettings});
countries = Ext.create('Ext.data.Store', {model: Country});

Ext.ajax.request({
    url: './account/adminresources',
    success: function(response) {
        var json = Ext.decode(response.responseText);
        adminsettings.loadData(json.adminsettings);
        countries.loadData(json.countries);
        //...
    } 
});

答案 1 :(得分:1)

在阅读extjs learning center grid faq时,我发现了我的问题的确切问题和答案。这是问题和答案:

使用一个AJAX请求加载多个商店?

还有一个使用XML here

的示例

从单个json字符串向多个数据存储显示数据,该字符串作为单个http请求的一部分返回。

选项1:see this thread

//create a JSON object:
{
dataStore1: /*1st json string */,
dataStore2: /*2nd json string */
}
//decode the json packet...
var json = Ext.decode(response.responseText);
//load the stores:
store1.loadData(json.dataStore1);
store2.loadData(json.dataStore2);

选项2:

 //create a JSON object:
 {
 dataStore1: /*1st json string */,
 dataStore2: /*2nd json string */
 }
 //decode the json packet...
 var json = Ext.decode(response.responseText);
 //create new proxy data for stores as hendricd mentioned:
 store1.proxy.data = json.dataStore1;
 store2.proxy.data = json.dataStore2;
 //load stores
 store1.load();
 store2.load();

 //where stores' proxy has to be defined like this:
 proxy: new Ext.ux.data.BufferedPagingMemoryProxy([])
 //I guess this can be used in case someone is using PMP (paging memory proxy)