11

データのツリーをモデル化するために ember-data を使用した人はいますか?

私はそれが次のようなものになると思います:

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

ただし、これを機能させることができなかったため、次のいずれかを信じることができます:1)これを設定する方法が間違っているか、2)現在、emberを使用してツリーをモデル化することはできません-データ。

願わくば後者ではなく前者であってほしい…

もちろん、それは 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 }
    ]
}

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

4

3 に答える 3

14

あなたのフィドルが機能するのを妨げるいくつかの小さなことがあります:

  • 関数はDS.hasMany引数として文字列を要求します。引用符を忘れないでください:DS.hasMany('Node')

  • フィクスチャの定義では、hasManyリレーションシップは、または何かによって後置されるべきではありません_ids。プレーンな名前を使用してください。例えば:{ id: 42, children: [2,3], parent_id: 17 }

  • lengthプロパティには、次の関数DS.ManyArrayを使用してアクセスする必要があります。getroot.get('children.length')

  • デフォルトでは、フィクスチャアダプターはajax呼び出しをシミュレートします。クエリは、find50ミリ秒待機した後にレコードにデータを入力します。あなたのフィドルでは、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つ:Emberアプリはグローバルスコープ(no var)で宣言する必要があり、Ember-dataモデルはアプリスコープ(で置き換える)var Node = ...で宣言する必要があるようです。App.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'));
于 2012-08-21T08:16:21.127 に答える
1

逆を設定するまで、これはうまくいきませんでした:

App.Node = DS.Model.extend({
    children: DS.hasMany('App.Node', {inverse: 'parent'}),
    parent:   DS.belongsTo('App.Node', {inverse: 'children'}) });
于 2013-08-23T16:03:41.140 に答える
-3

確かではありませんが、emberガイドに記載されている例によると

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

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

{
  "post": {
    "comment_ids": [1, 2, 3]
  }
}
于 2013-03-07T06:30:03.153 に答える