忽略了Ember数据侧载模型

时间:2013-05-29 07:25:58

标签: ember.js ember-data

我是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。

2 个答案:

答案 0 :(得分:1)

在您的侧载响应中,module_id应为id

(或者您可以将ember-data配置为使用module_id,但格式化服务器响应应该更简单?)

---编辑解释---

我不确定原来的REST来电是“完美运作”。没有idember-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'
});