Ember.js 如何处理EmberJS客户端中的多个对象?
我有一个具有多对多关系的数据模型。假设我有一个Ember.js 如何处理EmberJS客户端中的多个对象?,ember.js,many-to-many,Ember.js,Many To Many,我有一个具有多对多关系的数据模型。假设我有一个生产者模型和一个客户模块。客户可以从任意数量的生产商处购买,而产品可以为任意数量的客户提供服务 在后端,我有三个表的标准关系配置: 顾客 制作人 客户2生产商 我的余烬模型目前如下所示: // models/producer.js import DS from 'ember-data'; export default DS.Model.extend({ customers: DS.hasMany('module'), }); // mod
生产者
模型和一个客户
模块。客户可以从任意数量的生产商处购买,而产品可以为任意数量的客户提供服务
在后端,我有三个表的标准关系配置:
- 顾客
- 制作人
- 客户2生产商
// models/producer.js
import DS from 'ember-data';
export default DS.Model.extend({
customers: DS.hasMany('module'),
});
// models/customer.js
import DS from 'ember-data';
export default DS.Model.extend({
producers: DS.hasMany('module'),
});
现在我正在处理fixture,我所做的只是用“targets”的id定义客户
和生产者
数组。问题是,我迟早会切换到真正的REST后端,这意味着我必须处理模型不匹配的问题。我想我必须选择:
- 定义一个余烬模型
。这可能会起作用,但我想我必须编写大量的样板文件,而且很可能无法从模型中访问关系(customer2producer
)将无法直接工作,我可能必须处理并执行以下问题:customer.get('producers')
- 挂接到序列化器/反序列化器系统,并将后端
对象转换为Ember模型引用。我不完全确定这是否可行,但我想说这是因为快速阅读了以下问题:customer2producer
我想这是一种非常常见的情况,我想知道解决这个问题的最干净的方法是什么。提前感谢。您的数据库不需要映射到REST API。特别是您没有平面数据的限制(现在在某些数据库中也没有) 如果您控制后端API,我只会返回如下响应: 获取/获得客户
{
customers: [
{id: 1, producers: [1, 2]},
{id: 2, producers: []},
]
}
获取/制作
{
producers: [
{id: 1, customers: [1]},
{id: 2, customers: [1]}
]
}
您的REST后端应该关注序列化和反序列化到数据库模型,而不是您的前端应用程序
如果您曾经有无法立即修改的API(移动应用程序、第三方等)随着时间的推移,您的REST API自然会与后端模型分离,从而为您提供数据转换工作。因此,我真的想强迫您只做对REST有意义的事情。这是一个非常好的选择,但我不明白为什么我应该明确地选择这种方式而不是在前端管理关系。。。(除了我在Ember方面缺乏经验之外……在后端编写代码对我来说其实更容易)@ikaros45你仍然需要管理关系。你最终会得到另外一个端点
/customer2producers
另一个模型,除了保持双向关系之外什么都做不了。或者如果你是说向关系端点发出额外的请求,而没有相应的余烬模型,那么你最终会做一个奇怪的越界在将数据推送到存储区之前,将关系信息侧向加载并跟踪到适配器中。这只是一个缓慢、冗长和笨拙的过程。是的,通过管理关系,我的意思是拥有一个ember modelcustomer2producer
…关键是我的后端已经有了它(默认情况下,这是我正在使用的框架中的…)。我问题的第一个链接似乎提供了一个解决方案来导航许多关系,但看起来有点笨重…@ikaros45我明白了。它笨重而缓慢,因为它是一个额外的端点来加载数据,将在您获得初始数据后加载(除非您使用嵌入的记录,但是您基本上已经在进行转换,因此您还可以包括关系ID),如果有人在半个地球上跑了100毫秒,你的用户就要等200毫秒,然后才能依次通过internet。我之所以要使用这样的中间模型,唯一的原因是如果它上面有数据,然后使用计算属性以方便访问。速度在这里不是问题,这是针对某种intranet的。但是我想我会支持你的方法来避免一些javascript方面的麻烦。。。