【问题标题】:How do I load two models in one JSON request in Ember-data?如何在 Ember-data 的一个 JSON 请求中加载两个模型?
【发布时间】:2012-11-23 09:47:31
【问题描述】:

使用 Ember-data 和 Ember.js,我尝试通过一个 JSON 请求加载两个模型。这些模型有类似的关系:

App.Person = DS.Model.extend({
    name:  DS.attr('string'),
    dogs:  DS.hasMany('App.Dog'),
});

App.Dog = DS.Model.extend({
    name:  DS.attr('string'),
    owner: DS.belongsTo('App.Person'),
});

我的服务器正在发送这样的 JSON:

{
    "dog": {
        "id": 1,
        "name": "Fido",
        "owner": {
            "id": 1,
            "name": "John Smith",
            "dogs": [1]
        }
    }
}

...然而,Ember-data 仍然向我的服务器发送请求(使用 findQuery),试图获取所有者 JSON。

我设置了一个 jsFiddle 来演示它here。要查看问题发生,您需要转到此链接以激活路线/模板:

http://fiddle.jshell.net/6kQ8s/2/show/#/dog/1

我没有故意在我的适配器中定义 findQuery(),因为我不应该需要它来获取我已经发送的数据……对吗?

有谁知道我在这里做错了什么?

【问题讨论】:

    标签: javascript ember.js handlebars.js ember-data


    【解决方案1】:

    我正在执行以下操作(使用 ember-data 修订版 8)

    App.Dog = DS.Model.extend({
        name:  DS.attr('string'),
        owner: DS.belongsTo('App.Person', { embedded: true }),
    });
    

    此外,我必须告诉序列化程序加载此关系的映射。 虽然不是必需的,但我使用的是我自己的 DS.Serializer 子类。初始化时 序列化程序加载 Person 类的映射的时间,该映射指定 应该加载嵌入的关系。

      App.WOSerializer = DS.Serializer.extend({
        init: function(){
          this._super();
          this.map(App.Dog, {
            person: {
              embedded: 'load'
            }
          });
      });
    

    由提问者编辑:

    序列化器需要在适配器中初始化。

    App.adapter = DS.Adapter.create({
        // ...
        serializer: App.WOSerializer.create()
    });
    

    【讨论】:

    • 你能通过编辑this jsFiddle 来证明这是可行的吗? (它拥有所有库的最新版本)即使在为适配器指定了序列化程序之后,我也无法让它工作。
    • 好的,但首先提供一个有效的示例,除了关系。我的意思是当前的例子甚至没有显示狗的名字。不要忘记使用大写的类名(例如 App.Adapter 而不是 App.adapter)。因此,如果您创建一个至少能够显示狗名称的示例,那么我也会添加显示所有者名称的代码。
    • 嗨,我刚刚尝试了你的新小提琴,但我仍然没有在结果窗格中看到狗的名字。我在 Mac 上尝试了 FireFox、Chrome 和 Safari。忽略我之前关于大写类名的评论。虽然这是真的,但它不适用于您的示例中的 App.adapter,因为它不是一个类,而是一个对象。我错过了“创建”,以为我读到了“扩展”。
    • 即使访问此链接? fiddle.jshell.net/AwgXg/show/#/dog/1 每次更改后,您都必须更新 Fiddle 并转到激活路由/模板的 URL,这很烦人,但这是 ATM 的唯一方法。刚刚在 OS X 和 Linux 的 Firefox 和 Chrome 上尝试过,在所有情况下都显示了狗的名字。
    • 好的,谢谢。我现在已经调整了您的示例以显示相关对象。你可以看到它here
    【解决方案2】:

    尝试使用embedded 属性。

    App.Dog = DS.Model.extend({
        name:  DS.attr('string'),
        owner: DS.belongsTo('App.Person', { embedded: true }),
    });
    

    【讨论】:

    • 我在问这个之前试过这个,恐怕它不起作用。您能否使用我提供的 jsFiddle 试用并演示您的解决方案?
    • @DavisSorenson,我认为我的问题stackoverflow.com/questions/13479842/… 和你的一样。我也有同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多