2011-09-03 49 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)