2012-08-16 76 views
11

有沒有人使用燼數據來建模數據樹?灰燼數據遞歸hasMany關聯

我相信它會是這樣的:

Node = DS.Model.extend({ 
    children: DS.hasMany(Node), 
    parent: DS.belongsTo(Node) 
}); 

但是,我一直沒能得到這個工作,這導致被認爲可以:1)我只是在如何簡單的錯誤我或者,2)目前無法使用ember-data對樹進行建模。

我希望是前者,而不是後者?

當然也可能是JSON ...我假設JSON應該是這樣的形式:

{ 
    nodes: [ 
     { id: 1, children_ids: [2,3], parent_id: null }, 
     { id: 2, children_ids: [], parent_id: 1 }, 
     { id: 3, children_ids: [], parent_id: 1 } 
    ] 
} 

任何有關這個問題的提示/建議將不勝感激。

+0

什麼不正確?您能否在您的問題中添加一些代碼以向我們展示問題? – 2012-08-20 16:18:37

+0

當然,我建立了一個簡單的[jsFiddle示例](http://jsfiddle.net/heuristocrat/5aqHx/),它顯示我相信我應該定義模型,然後搜索根節點並嘗試訪問孩子們(這是事物分解的地方)。 – Heuristocrat 2012-08-20 16:59:52

+0

這是一個有用的小提琴。我在非遞歸hasMany中自己也遇到了類似的問題,所以我對看到任何解決方案感興趣。 – pjmorse 2012-08-20 18:17:40

回答

14

有幾個是防止你的提琴工作的小東西:

  • DS.hasMany功能要求一個字符串作爲參數。不要忘記報價:DS.hasMany('Node')

  • 在夾具定義中,hasMany關係不應該由_ids或任何其他後綴。只需使用普通名稱即可。例如:{ id: 42, children: [2,3], parent_id: 17 }

  • DS.ManyArraylength屬性應使用get函數訪問:root.get('children.length')

  • 默認情況下,燈具適配器模擬一個Ajax調用。 find查詢將在等待50ms後填充記錄。在你的小提琴中,root.get('children.length')呼叫來得太早。您可以配置固定裝置適配器,以便它使同步調用:

    App.store = DS.Store.create({ 
        revision: 4, 
        adapter: DS.FixtureAdapter.create({ 
         simulateRemoteResponse: false 
        }) 
    }); 
    

    也可以加載數據到店無任何適配器:

    App.store.loadMany(App.Node, [ 
        { id: 1, children: [2, 3] }, 
        { id: 2, children: [], parent_id: 1 }, 
        { id: 3, children: [], parent_id: 1 } 
    ]); 
    
  • 和最後一個:它看起來像灰燼應用應在全球範圍內(不var)聲明,而且灰燼數據模型應該在應用範圍內聲明(由App.Node = ...更換var Node = ...

全例如:

App = Ember.Application.create(); 

App.store = DS.Store.create({ 
    revision: 4 
}); 

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node'), 
    parent:   DS.belongsTo('App.Node') 
}); 

App.store.loadMany(App.Node, [ 
    { id: 1, children: [2, 3] }, 
    { id: 2, children: [], parent_id: 1 }, 
    { id: 3, children: [], parent_id: 1 } 
]); 

var root = App.store.find(App.Node, 1); 

alert(root.get('children')); 
alert(root.get('children.length')); 
+0

假設App.Node有一個屬性「名稱」,是否有可能遍歷模板中的所有孩子,如下所示:{{#controller.children中的每個孩子}} {{child.name}} {{/ each}} ? – lipp 2012-11-02 13:01:28

+0

如何在不遇到無限遞歸的情況下刪除節點?我目前正面臨這個問題。 – 2013-02-25 05:21:54

-3

不知道,但根據實施例在餘燼導向給出

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('App.Comment') 
}); 

的JSON應編碼的關係作爲ID數組:

{ 
    "post": { 
    "comment_ids": [1, 2, 3] 
    } 
} 
1

這沒直到我建立反轉之前,我一直不工作:

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node', {inverse: 'parent'}), 
    parent: DS.belongsTo('App.Node', {inverse: 'children'}) }); 
+0

似乎在ember-data 1.0.0-beta.7(最後的版本)中不起作用。有沒有人在最新版本中解決了這個問題? – Gorzas 2014-04-14 13:40:36