我是Ember的新手,我遇到了一个问题,我没有看到其他任何地方的重复,所以我确定我做的事情很傻。我有这些模型:
App.User = DS.Model.extend({
username: DS.attr("string"),
userId: DS.attr("number"),
modules: DS.hasMany("App.Module")
});
App.Module = DS.Model.extend({
moduleId: DS.attr("number"),
name: DS.attr("string")
});
请注意,我的模块模型只是一个用户可以拥有的容器,许多用户可能共享相同的模块 - 它们实际上由服务器上的Enum表示。因此,后端没有Module>的映射。用户,所以我离开了App.Module的DS.ownedBy或DS.hasMany。但是,我在那里用“用户:DS.hasMany('App.User')”尝试了我的测试,结果相同。如果事实证明是必要的,我可以保留这样的映射,但我现在没有其他理由这样做,所以被迫将这样的表添加到我的数据库中会有点不幸。
我正在使用Ember.Auth进行身份验证,当我的应用加载并登录时,服务器请求(按预期):
users/nathan?authToken=<token>
根据余烬数据文档:
,结果也是我认为应该如此{
"user": {
"username": "nathan",
"user_id": 1,
"module_ids": [1,2]
},
"modules": [
{"module_id": 1, "name": "Account Settings"},
{"module_id": 2, "name": "Manage Websites"}
]
}
然后我在Chrome控制台中测试:
App.Auth.get("user").get("modules");
或
App.User.find("nathan").get("modules");
并且在这两种情况下,Ember向我的服务器发出请求以获取模块1和2的数据。如果我重复相同的请求,它不会再次返回服务器,因此它正确地存储结果那个时候,它只是它忽略的侧载。
我正在使用ember-1.0.0-rc4和ember-data-0.13。
答案 0 :(得分:1)
在您的侧载响应中,module_id
应为id
。
(或者您可以将ember-data
配置为使用module_id
,但格式化服务器响应应该更简单?)
---编辑解释---
我不确定原来的REST
来电是“完美运作”。没有id
。 ember-data
确实会看到您最初加载的两个module
,但它看不到id
,因此它不知道它们是module
s 1
和分别为2
。默认情况下(可更改),ember-data
期望id
被称为id
;您的module_id
(和user_id
)只会被视为常规属性。
在您的下一次API调用(大概是/modules?ids[]=1&ids[]=2
)时,ember-data
默默地假设,因为您请求的两个module
和两个module
回来了,应该是你要求的两个。尝试发回这个
{
"modules": [
{"module_id": 3, "name": "Foo module"},
{"module_id": 4, "name": "Bar module"}
]
}
对于请求/modules?ids[]=1&ids[]=2
,您仍获得“成功”观察。
使用App.Module.find(1).get('name')
- 回复来module_id
,您将获得undefined
;现在尝试使用id
- 响应,您将按预期获得Account settings
。
答案 1 :(得分:0)
您是否已将RestAdapter配置为侧载模块?
像这样:
DS.RESTAdapter.configure('App.Module', {
sideloadsAs: 'modules'
});