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应该使用以下get函数访问:root.get('children.length')

  • 默认情况下,fixture 适配器模拟一个 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 }
    ]);
    
  • 最后一个:似乎 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'));
于 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 回答