2012-08-14 83 views
1

我是Extjs 4的新手,我試圖瞭解如何爲嵌套對象的數據創建模型。Extjs 4 Ext.data.Model:如何爲嵌套對象建模

示例數據:

{ 
    data1:{ 
     field1:1, 
     field2:2, 

     **objField1**:{ 
      objField1:1, 
      objField2:2, 

      **anotherObj**:{ 
      field1:1, 
      field2:2, 
      arrayofObjs:[ 
       { 
       //... 
       }, 
       //... 
      ] 
      } 
     }, 

     objField2:{ 
      //... Some more fields or objects 
     }, 

    data2:{ 
    //... 
    } 
} 

我想知道我怎麼會變成這樣的數據模型。這些字段很容易

Ext.define('MyModel', { 
extend: 'Ext.data.Model', 
fields: [ 
    {name: 'field1', type: 'int'}, 
    {name: 'field2', type: 'int'} 
], //... 

但你如何模擬對象?我想我可以爲子對象和設置關聯創建一個模型,但是在閱讀文檔後,他們似乎需要有ID。所以,如果你看一下belongsTo頁面,「所有者模型應該有一個引用關聯模型主鍵的外鍵」。

我不想看看具有外鍵關係的數據,只是具有子對象的對象。所以服務器可能會返回一個帶有多個子對象的JSON對象,其中一個對象可能需要綁定到一個網格,另一個對象的數據到一個選擇框等。

謝謝!

+0

如果您在同一個響應中返回它們,並且可選地將它們寫入服務器,則它們不需要ids。他們只需要身份證,如果你正在加載他們在不同的請求 – 2012-08-14 17:58:40

+0

你也不需要*使用模型。你也可以通過原始的json。 – 2012-08-14 18:15:26

+0

你可以試試這個解決方案: http://stackoverflow.com/questions/9891537/extjs-and-nested-models – ivy 2013-10-09 12:34:51

回答

4

我想你在這裏有幾個問題。

首先,Ext JS中的模型主要用於表示關係數據,即SQL數據庫中的行。你可以把它們轉換成你想做的任何事,但這並不意味着它會很容易,而且總是存在着「爲什麼」的問題。

其次,Ext.data.Model根本不適合表示樹狀結構;你可以使用Ext.data.NodeInterface。 NodeInterface是kinda Model覆蓋類,一個mixin的一部分,通常是相當頑固和僵化的事情。光明的一面是它的工作原理,另一方面是沒有其他班級可以做同樣的事情。

接下來,嵌套數據對象並不一定意味着它們實際上是相互關聯的。你說你想從一個全局JSON響應中獲取對象;這可以通過配置多個商店並使用不同的Readers併爲它們提供相同的JSON對象來輕鬆完成。

OTOH,數據結構看起來有點複雜。這是在服務器端初步優化的嘗試嗎?也就是說,將我們可能需要的所有東西放到一個巨大的JSON中以節省服務器點擊量?如果是這樣,看看Ext.Direct遠程處理;它可以幫助您避免大量頭痛。

+0

謝謝亞歷克斯。我認爲你的第三個建議是我需要做的。我認爲我需要有一個數據模型。但是,如果我可以創建不同的商店和讀者並將它們指向應該工作的同一個json對象。但是,我能夠將更多或新的數據更新/加載到該json對象中,並讓組件(如網格)自動更新? 是的,服務器只返回larges json對象。所以我會查詢一個東西,並獲取大量的數據。我需要所有數據,但希望以不同方式顯示某些部分。一些網格中的某些數據在選擇框等 – Jerinaw 2012-08-15 18:20:49

+0

默認情況下,商店會要求其代理獲取數據,通過Reader運行它來解析,然後作爲一組實例化的模型加載它。您可以通過使用相同的代理*實例*(與配置對象相對)配置存儲來避免多次請求相同的數據,並在每次要加載存儲時使用不同的讀者配置提供該代理。或者您可以創建集中的Ajax處理程序,它將解析JSON並將其提供給不同的商店。無論如何,這將是大量的手動數據傳輸,尷尬和脆弱;第二種方法可能更容易。 – 2012-08-15 18:52:03

+0

那麼我怎麼能在MVC中做上面的第一個建議呢?在Ext.application.launch中創建一個代理實例將其附加到應用程序中......或者創建一些全局代理,並在定義商店時...對於Ext來說,抱歉還是一個新的嘗試,點我可以修改它。我只想要一個數據實例,就像你說我會有一個代理。現在我需要很多商店使用相同的代理服務器......但是在什麼時候或者如何更改讀者? – Jerinaw 2012-08-16 15:12:22