2011-09-03 87 views
1

假设我在客户端使用extjs4构建了这个Web应用程序,并在服务器端使用了Zend框架动作控制器。我在服务器端的数组的数组,他们可以像JSON输出到我想创建只有一家门店的client.when,通常的方法是这样工作:如何从获取请求中创建多个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' 
    } 
} 

}); 

如果我想创建多个JSON只从一个HTTP请求存储到服务器? 此服务器将不会收到每个商店的远程代理请求,并且将为所有商店执行一个请求。 这里是由服务器返回我JSON的例子:

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

如何为JSON商店adminsettings,国家,语言可以只用一个HTTP请求到服务器产生的?或许我需要定义一个代理和3个读者?

+0

你问如何格式化JSON代表多店? – jfriend00

+0

@ jfriend00我真的问如何在客户端处理该JSON以从该JSON创建多个商店。 –

+0

在您的JSON响应中,哪些数据构成“商店”?我们不知道这个词的含义。我看到一组管理设置,然后是一系列国家和语言列表。哪些数据片段是“商店”? – jfriend00

回答

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到manualy加载数据:

事情是这样的:

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); 
     //... 
    } 
}); 
+0

感谢您的非常有用的答案。你知道我可以把你的代码放在MVC应用程序中吗?在模型文件中,商店还是其他地方? –

+0

只需扩展Ext.app.Controller。如果你只需要显示数据把它放在init方法中。在其他情况下,您可以在控制器中定义一个函数,并在需要刷新数据时调用它。 – Ivan

+0

在您的示例中,如果在具有分页的网格中使用adminSettings存储,那么您如何设置将由分页工具栏使用的adminSettings存储的总数? –

1

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

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

还有使用XML从一个单一的JSON字符串,一个返回为单个HTTP请求的一部分here

显示数据到多个数据存储的示例。

选项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)