2012-08-16 14 views
11

誰かがember-dataを使ってデータツリーをモデル化していますか?Ember-Data recursive hasMany association

私はようなものになるだろうと仮定します:1)私はどのようにIで単純に間違ってる:

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

しかし、私はどちらかと信じてすることでつながり、この作業を取得することができていませんこれを設定するか、2)ember-dataを使ってツリーをモデル化することは現在できません。

{ 
    nodes: [ 
     { id: 1, children_ids: [2,3], parent_id: null }, 
     { id: 2, children_ids: [], parent_id: 1 }, 
     { id: 3, children_ids: [], parent_id: 1 } 
    ] 
} 
:もちろん

私はそれが後者の前者ではないことを願って...

が、それはJSONかもしれない...私は、JSONの形式でなければならないと仮定しています

この問題のヒント/アドバイスをいただければ幸いです。

+0

正確には動作しません。問題を示すためにあなたの質問にいくつかのコードを追加してください。 –

+0

もちろん、モデルを定義してルートノードの検索を行い、アクセスしようとしていると思われる方法を示すシンプルな[jsFiddle example](http://jsfiddle.net/heuristocrat/5aqHx/)を設定します子供たち(物事が崩壊する場所)です。 – Heuristocrat

+0

これは役に立つフィドルです。私は非再帰的なhasManyの中で自分自身で同様の問題を抱えていましたので、私はどんな解決策にも興味があります。 – pjmorse

答えて

14

動作するようにあなたのフィドルを防ぐため、いくつかのささいなことがあります。

  • DS.hasMany関数は、引数として文字列を要求します。引用符を忘れないでください:フィクスチャの定義でDS.hasMany('Node')

  • を、hasMany関係は_idsか何かで後置されてはなりません。ただの名前を使用してください。 DS.ManyArraylength性がget関数を使用してアクセスされなければならない{ id: 42, children: [2,3], parent_id: 17 }

  • :例えば、デフォルトでroot.get('children.length')

  • 、固定具アダプタは、AJAX呼び出しをシミュレートします。クエリがfindの場合、50ミリ秒待ってからレコードが入力されます。あなたのフィドルでは、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 } 
    ]); 
    
  • と最後の1:それは同期呼び出しを行うようにするには、治具アダプタを設定することができ、それは、エンバーのアプリのように思えます

App.Node = ...によって var Node = ...を置き換える)、グローバルスコープ(NO var)内で宣言されなければならない、とエンバーデータモデルは、アプリケーションのスコープ内で宣言されなければなりません

全例:

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に属性 "name"があるとすると、テンプレート内のすべての子に対して以下のように反復することができます:{{#子コントローラ内の子}} {{child.name}} {{/ each}} ? – lipp

+0

無限再帰を起こさずにノードをどのように削除しますか?私は現在、この問題に直面しています。 –

-3

わからないが、一例ごとに燃えさしガイドで与えられる

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

JSONは、IDの配列としての関係をエンコードする必要があります。

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

これのdidn逆数を設定するまで、私の仕事はありません。

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