我有点奇怪的情况,我不知道如何处理它。
假设我有一堆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循环助手来处理这个问题,但是无法弄明白。当我看到那些封锁助手不受支持时,我觉得我的方向错了。我一直试图想到如何使用视图甚至组件来实现这一目标,但我没有看到它。我在我的应用程序中的几个地方都有这种东西,并且不必编写大量的专业类来处理每个案例。
任何和所有的意见,想法和帮助将深表感谢!谢谢!
答案 0 :(得分:0)
首先,我想说我认为你的旧JSON(items
关系)要好得多。国际海事组织,应该是一切关系。其次,我认为您之前遇到加载问题的原因是因为您的关系不是异步的。试试这个:
items: DS.hasMany(item, { async: true })
至于limit
hasMany关系的能力,您可以尝试覆盖模型的set
方法以在设置之前检查限制。如果添加的模型太多,您还可以使用Ember-Data的内置有效性功能使模型无效。
答案 1 :(得分:0)
为了解决这个问题,我在我的数据集中添加了一个新的空白项,其id为0.然后在我的API中,我更改了它,以便每个容器返回一个0的数组,每个插槽一个。 Ember关注数据,我可以正常迭代它们,但因为一切都是空白的,所以在我用选择器设置它之前不会显示任何内容。