如何使用ember处理嵌套的json响应?

时间:2013-12-29 07:21:41

标签: ember.js ember-data

也许我忽略了什么,但我无法弄清楚我应该如何

我有一个来自服务器的JSON,看起来像这样

{
  "articles": [
    {
      "user": {
        "name": "user",
        "username": "user",
        "_id": "52755cba74a1fbe54a000002"
      },
      "_id": "5275698c53da846e70000001",
      "__v": 0,
      "content": "content",
      "title": "title",
      "created": "2013-11-02T21:07:24.554Z"
    }
  ]
}

在模板中,我正在访问内容并且创建得很好,但是当我尝试获取user.name时,没有任何结果:

    {{#each article in model}}
        <span>{{ article.title }}</span>
        <span>by {{ article.user.name }}</span>
        <span>{{ article.created }}</span>
    {{/each}}

我注意到在模型中,无论我没有定义,都不会出现在模板中,所以它看起来像这样:

title: DS.attr('string'),
content: DS.attr('string'),
created: DS.attr('date')

但是当我尝试添加:

user: {
       name: DS.attr('string')
}

为了匹配嵌套的json,我收到错误。

ember无法处理嵌套的json吗?如果是,那怎么样?

感谢。

3 个答案:

答案 0 :(得分:5)

这可能是支持嵌入式文档的最简单方法(如果您不想更改JSON):

App.ArticleSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    user: {embedded: 'always'}
  }
})

请参阅:http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html。我没有测试过它!

答案 1 :(得分:3)

如上所述,自Ember Data 1.0 beta 1以来,嵌入式记录发生了重大变化,并且不再支持它。如果您需要嵌入式记录,可以查看ember-data-extensions项目:https://github.com/pixelhandler/ember-data-extensions它通过EmbeddedAdapter和EmbeddedRecordMixins提供对嵌入式记录的支持。

一个简单的实现示例:

App.ApplicationAdapter = DS.EmbeddedAdapter.extend({});

App.ApplicationSerializer = DS.EmbeddedSerializer.extend();

App.Article = DS.Model.extend({
    user: DS.belongsTo('user'),
    content: DS.attr('string'),
    title: DS.attr('string'),
    created: DS.attr('date')
});

App.User = DS.Model.extend({
    name: DS.attr('string'),
    username: DS.attr('string'),
    articles: DS.hasMany('article')
})

App.ArticleSerializer = App.ApplicationSerializer.extend({
    attrs: {
        user: {embedded: 'always'}
    }
});

但是你应该知道,只有在加载时才支持嵌入式记录。

答案 2 :(得分:1)

根据过渡指南; Ember数据尚不支持嵌入式记录。

https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records

有一个如何自己实现它的例子。另一种选择是使用ember-model,它支持嵌入式关联。对不起,我没有例子。

相关问题