我是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")
});
请注意,我的Module模型只是一个容器,用户可以拥有几个,并且许多用户可能共享相同的模块-它们实际上是由服务器上的Enum表示的。因此,后端没有Module > Users的映射,所以我在App.Module中保留了DS.ownedBy或DS.hasMany。但是,我在测试中也使用了"users: DS.hasMany('App.User')“,结果是一样的。如果有必要,我可以维护这样的映射,但我现在没有其他理由这样做,所以被迫将这样的表添加到我的数据库中将是一件有点不幸的事情。
我使用Ember.Auth进行身份验证,当我的应用程序加载并登录时,服务器会请求(不出所料):
users/nathan?authToken=<token>
根据ember数据文档,我认为结果也应该是这样的:
{
"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。
发布于 2013-05-29 08:54:18
在边载响应中,module_id
应为id
。
(或者,您可以将ember-data
配置为使用module_id
,但格式化服务器响应应该是更简单的方法?)
-用于解释的编辑
我不确定最初的REST
调用是否“完美工作”。没有id
的话。ember-data
确实看到了您最初侧面加载的两个module
,但它没有看到id
,所以它不知道它们分别是module
的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
,您仍将获得您的“成功”观察。
使用module_id
-response试用App.Module.find(1).get('name')
-您将获得undefined
;现在使用id
-response试用它,您将获得预期的Account settings
。
发布于 2013-05-29 08:15:58
您是否已将RestAdapter配置为旁载模块?
如下所示:
DS.RESTAdapter.configure('App.Module', {
sideloadsAs: 'modules'
});
https://stackoverflow.com/questions/16807879
复制相似问题