Ember-Data递归hasMany关联

时间:2012-08-16 23:54:20

标签: ember.js ember-data

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

我认为它会是这样的:

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 }
    ]
}

非常感谢有关此问题的任何提示/建议。

3 个答案:

答案 0 :(得分:14)

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

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

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

  • 应使用length函数访问DS.ManyArray的{​​{1}}属性:get

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

    root.get('children.length')

    或者您可以在没有任何适配器的情况下将数据加载到商店:

    App.store = DS.Store.create({
        revision: 4,
        adapter: DS.FixtureAdapter.create({
            simulateRemoteResponse: false
        })
    });
    
  • 和最后一个:似乎应该在全局范围内声明Ember应用程序(无App.store.loadMany(App.Node, [     { id: 1, children: [2, 3] },     { id: 2, children: [], parent_id: 1 },     { id: 3, children: [], parent_id: 1 } ]); ),并且应在应用程序范围中声明Ember数据模型(替换{{1} } var

完整示例:

var Node = ...

答案 1 :(得分:1)

在我设置反向之前,这对我不起作用:

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

答案 2 :(得分:-3)

不确定但是按照ember指南中给出的例子

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

JSON应该将关系编码为ID数组:

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