如何设置与限制的hasMany关系?

时间:2014-03-26 09:52:43

标签: ember.js ember-data

我有点奇怪的情况,我不知道如何处理它。

假设我有一堆Containers和每个容器hasMany items,但它们只有很多item_slots。例如,一个容器可以有3个插槽,而另一个容器只有1个。

App.Container = DS.Model.extend({
  name:DS.attr('string'),
  item_slots:DS.attr('number'),
  items:DS.hasMany('item')
});

App.Container.FIXTURES = [
  {id:1, name:'Container 1', item_slots:3},
  {id:2, name:'Container 2', item_slots:4},
  {id:3, name:'Container 3', item_slots:1}
];

然后我有一个Items列表可以进入这些插槽。

App.Item = DS.Model.extend({
  name:DS.attr('string')
});

App.Item.FIXTURES = [
  {id:1,name:'Item 1'},
  {id:2,name:'Item 2'},
  {id:3,name:'Item 3'},
  {id:4,name:'Item 4'}
];

我已经创建了一个jsBin here作为我正在尝试做的一个例子,但它并不完整。我已经评论了我坚持的部分。

我创建了一个组件,它提供了可以选择的所有不同项目的下拉列表。我的问题是如何为每个device_slots循环Container?然后,我可以为每个item-selector创建一个device_slot

我正在为此开发API,所以无论如何我都可以修改它以帮助解决这个问题,这是完全可能的。目前,有效载荷是这样的:

{ "containers":
   [{id:1,name:'Container 1',item_slots:3},
   {id:2,name:'Container 2',item_slots:4},
   {id:1,name:'Container 3',item_slots:1}]
}

它是这样的:

{ "containers":
   [{id:1,name:'Container 1',items:[1,2,3]},
   {id:2,name:'Container 2',items:[1,2,3,4]},
   {id:1,name:'Container 3',items:[1]}]
}

直到我开始真正使用它并意识到Ember自动关联物品(这太棒了!)。我尝试更改我的API,以便items只是一个包含空字符串或NULL的数组,我仍然可以使用#each进行循环,但我一直收到错误,指出所有项目都没有已经装好了。我改为item_slots以避免关系问题。

我试图创建一个for循环助手来处理这个问题,但是无法弄明白。当我看到那些封锁助手不受支持时,我觉得我的方向错了。我一直试图想到如何使用视图甚至组件来实现这一目标,但我没有看到它。我在我的应用程序中的几个地方都有这种东西,并且不必编写大量的专业类来处理每个案例。

任何和所有的意见,想法和帮助将深表感谢!谢谢!

2 个答案:

答案 0 :(得分:0)

首先,我想说我认为你的旧JSON(items关系)要好得多。国际海事组织,应该是一切关系。其次,我认为您之前遇到加载问题的原因是因为您的关系不是异步的。试试这个:

items: DS.hasMany(item, { async: true })

至于limit hasMany关系的能力,您可以尝试覆盖模型的set方法以在设置之前检查限制。如果添加的模型太多,您还可以使用Ember-Data的内置有效性功能使模型无效。

答案 1 :(得分:0)

为了解决这个问题,我在我的数据集中添加了一个新的空白项,其id为0.然后在我的API中,我更改了它,以便每个容器返回一个0的数组,每个插槽一个。 Ember关注数据,我可以正常迭代它们,但因为一切都是空白的,所以在我用选择器设置它之前不会显示任何内容。