Ember-Data递归hasMany关联

Heu*_*rat 11 ember.js ember-data

有没有人用ember-data建模数据树?

我会假设它会是这样的:

Node = DS.Model.extend({
    children: DS.hasMany(Node),
    parent:   DS.belongsTo(Node)
});
Run Code Online (Sandbox Code Playgroud)

然而,我无法得到这个工作,导致相信:或者我在如何设置它,或者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 }
    ]
}
Run Code Online (Sandbox Code Playgroud)

任何有关此问题的提示/建议将不胜感激.

Sté*_*ond 14

有几件小事阻止你的小提琴工作:

  • 该DS.hasMany函数要求String作为参数.不要忘记引号:DS.hasMany('Node')

  • 在夹具定义中,hasMany关系不应该是后缀_ids或任何东西.只需使用普通名称即可.例如:{ id: 42, children: [2,3], parent_id: 17 }

  • 应使用以下函数访问该length属性:DS.ManyArraygetroot.get('children.length')

  • 默认情况下,fixture适配器模拟ajax调用.在find等待50毫秒后查询将填充记录.在你的小提琴中,root.get('children.length')电话来得太早了.您可以配置夹具适配器,以便进行同步调用:

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

    或者,您可以在没有任何适配器的情

    App.store.loadMany(App.Node, [
        { id: 1, children: [2, 3] },
        { id: 2, children: [], parent_id: 1 },
        { id: 3, children: [], parent_id: 1 }
    ]);
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后一个:似乎应该在全局范围内声明Ember应用程序(否var),并且应该在应用程序范围中声明Ember数据模型(替换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'));
Run Code Online (Sandbox Code Playgroud)