0

我是 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 模型只是一个 User 可以拥有几个的容器,并且许多用户可能共享相同的模块 - 它们实际上由服务器上的 Enum 表示。因此,后端没有 Module > Users 的映射,因此我将 DS.ownedBy 或 DS.hasMany 排除在 App.Module 之外。但是,我也尝试在其中使用“用户: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。

4

2 回答 2

1

在您的侧载响应中,module_id应该是id.

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

---编辑解释---

我不确定最初的REST通话是否“完美运行”。没有id. ember-data确实看到了module您最初侧载的两个 s ,但它没有看到 no id,因此它不知道它们分别是modules12。默认情况下(可更改),ember-data期望id调用id; 您的module_id(and user_id) 仅被视为常规属性。

在您的下一次 API 调用(/modules?ids[]=1&ids[]=2大概)中,ember-data默默地假设,由于您请求的两个modules 和两个modules 回来了,它们应该是您请求的两个。尝试发回这个

{
    "modules": [
        {"module_id": 3, "name": "Foo module"},
        {"module_id": 4, "name": "Bar module"}
    ]
}

对于请求/modules?ids[]=1&ids[]=2,您仍然会得到“成功”的观察结果。

试试-response - 你会App.Module.find(1).get('name')得到; 现在用-response 试试,你会得到预期的结果。module_idundefinedidAccount settings

于 2013-05-29T08:54:17.553 回答
0

您是否已将 RestAdapter 配置为旁加载模块?

像这样:

DS.RESTAdapter.configure('App.Module', {
  sideloadsAs: 'modules'
});
于 2013-05-29T08:15:58.357 回答