【问题标题】:Ember-Data recursive hasMany associationEmber-Data 递归 hasMany 关联
【发布时间】:2012-08-16 23:54:20
【问题描述】:

有人使用 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 }
    ]
}

对于这个问题的任何提示/建议将不胜感激。

【问题讨论】:

  • 什么不完全有效?您能否在您的问题中添加一些代码以向我们展示问题?
  • 当然,我设置了一个简单的jsFiddle example,它显示了我认为我应该如何定义模型,然后搜索根节点并尝试访问子节点(这就是问题所在下)。
  • 这是一个有用的小提琴。我自己在非递归 hasMany 中也遇到过类似的问题,所以我有兴趣看到任何解决方案。

标签: ember.js ember-data


【解决方案1】:

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

  • DS.hasMany 函数要求一个字符串作为参数。不要忘记引号:DS.hasMany('Node')

  • 在夹具定义中,hasMany 关系不应以_ids 或其他任何东西为后缀。只需使用简单的名称。例如:{ id: 42, children: [2,3], parent_id: 17 }

  • 应使用get 函数访问DS.ManyArraylength 属性: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 = ... 替换为 @987654336 @)

完整示例:

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'));

【讨论】:

  • 假设 App.Node 有一个属性“name”,是否可以像这样遍历模板中的所有子级:{{#each child in controller.children}}{{child.name} }{{/每个}}?
  • 如何在不遇到无限递归的情况下删除节点?我目前正面临这个问题。
【解决方案2】:

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

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

【讨论】:

  • 它似乎不适用于 ember-data 1.0.0-beta.7(最新版本)。有人在最新版本中解决了这个问题吗?
【解决方案3】:

不确定,但根据 ember 指南中给出的示例

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多