1

我正在寻找一种从 Ember 模型生成 D3.js 数据结构的方法,以将我现有的应用程序转换为 Ember。目标是显示任务树,每个任务有 0 个或多个子任务。

这是我想提供给 D3.js 的结果:

[
  {
    "parent": 429,
    "name": "Parent task 1",
    "id": 428
    "children": [
      {
        "parent": 428,
        "name": "Sub task 1",
        "id": 425
      },
      {
        "parent": 428,
        "name": "Sub task 2",
        "id": 426
      }
    ]
  },
  ...
]

我试图这样定义我的模型:

Minp.Task = DS.Model.extend({
  name: DS.attr(),
  subtasks: DS.hasMany('task'),
  data: Ember.computed(function () {
    return {
      id: this.get('id'),
      name: this.get('name'),
      type: 'task',
      children: this.get('subtasks').map(function (task) {
        return task.get('data');
      })
    };
  }).property()
});

但我收到“超出最大调用堆栈大小”错误。似乎thisdata属性调用会导致在无限循环中再次调用它。

如果我为孩子返回一个空数组,一切正常。

你知道我为什么会得到这个吗?这是另一种方式吗?

4

2 回答 2

1

我认为您最好使用关联,不是吗?尝试使用自引用数据结构。

Minp.Task = DS.Model.extend({
  parent: DS.belongsTo('task', inverse: 'children');
  children: DS.hasMany('task', async: true, inverse: 'parent');
});

希望这会有所帮助。有点取决于你想用这些东西做什么,但这是我在构建基于树的数据结构时通常使用的。

于 2013-11-13T05:47:36.353 回答
0

data已经是 DS.Model 上的一个属性,并且大概是通过gets... 调用它现在正在进入您的重新定义data,并导致您的循环。

于 2013-11-10T15:02:40.120 回答