Ember-数据递归 hasMany 关联

2024-01-20

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

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


有一些小事情会阻止你的小提琴工作:

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

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

  • the 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 = ... by 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'));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ember-数据递归 hasMany 关联 的相关文章

随机推荐