我有关于Ember数据和Mongodb嵌入对象的问题。这是我的模特:
App.Contact = App.Entity.extend({
name : DS.attr('string'),
firstname : DS.attr('string'),
additional_names : DS.attr('string'),
civility : DS.attr('string'),
birthday : DS.attr('date'),
organization : DS.belongsTo('App.Organization'),
role : DS.attr('string'),
photo_source : DS.attr('string'),
photo_uri : DS.attr('string'),
gravatar_mail : DS.attr('string'),
addresses : DS.hasMany('App.Address', { embedded: true }),
emails : DS.hasMany('App.Email', { embedded: true }),
phones : DS.hasMany('App.Phone', { embedded: true })
});
现在我通过API获取联系人:(GET / app / api / v1 / contact / 4f86c4774ab63c2417000001 /)这里是我得到的:
{
"additional_names": null,
"addresses": [],
"birthday": null,
"civility": null,
"emails": [
{
"email": "alexandre@test.com",
"label": null,
"resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
"type": "HOME"
}
],
"firstname": "Alexandre",
"gravatar_mail": null,
"groups": [],
"id": "4f86c4774ab63c2417000001",
"name": "Simoui",
"organization": null,
"phones": [],
"photo_source": null,
"photo_uri": "/static/img/nophoto.png",
"resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
"role": null
}
我的“root”对象有一个id但嵌入对象“email”却没有。因为在mongodb中,id不在子文档上设置,而只在根文档上设置。
这样ember-data看到“email”对象没有id,然后它试图通过API获取完整的对象。例如:GET / app / api / v1 / email / set // 404(未找到)
为了确保这是怀特问题,我试图返回带有假ID字段的Mongodb子文档。喜欢:(见电子邮件对象的差异)
{
"additional_names": null,
"addresses": [],
"birthday": null,
"civility": null,
"emails": [
{
"id": 431,
"email": "alexandre@test.com",
"label": null,
"resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
"type": "HOME"
}
],
"firstname": "Alexandre",
"gravatar_mail": null,
"groups": [],
"id": "4f86c4774ab63c2417000001",
"name": "Simoui",
"organization": null,
"phones": [],
"photo_source": null,
"photo_uri": "/static/img/nophoto.png",
"resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
"role": null
}
然后我没有问题一切都很好。所以我的问题是:有没有办法解决它?
答案 0 :(得分:3)
我已经开始尝试解决方法了。我只在只读的基础上使用没有ID的嵌入对象,所以我没有测试保存,创建和正确的模型状态管理(isDirty等)......但到目前为止,这已经解决了我的类似问题。
不幸的是我需要修改ember-data源。请参阅ember-data的my fork。
我的更改范围涉及修改hasAssociation()
的{{1}}功能。我所做的是在第一次访问关联的计算属性返回时注入伪ID。我在定义DS.hasMany
的闭包中保留了一个客户端ID计数器injectedIdCounter
,以及一个获取ID并更新计数器的函数。然后我定义了一个新选项hasAssociation()
,它是一个没有ID的嵌入式子文档。每次在关联上调用trueEmbedded
时,都会检查元素的ID,如果id不存在,则会注入一个。如果已添加ID,则需要调用get()
,以便将修改后的关联存储回父对象。这至少解决了我的问题。这是我的代码。
set()
你会认为嵌入式文档不需要ID,但是ember-data首先获取对象的所有ID然后对象本身,即使对于嵌入式关联,也意味着像这样的一些混乱的解决方案是必须的。
希望这将在未来的Ember版本中修复。
干杯, 凯文