嵌入式模型在Ember Data 1.0.0-beta.2中

时间:2013-12-06 10:19:41

标签: json ember.js ember-data

我正在使用简单的餐厅菜单,我从服务器收到以下JSON:

[
  {
    "id": 251,
    "name": "Borsch",
    "category_id": 47,
    "price": "135.0",
    "photo": {
      "origin": "/path/to/origin.png",
      "resize": "/path/to/resize.png"
    }
  },
  // A lot of other dishes
]

正如您所看到的,我有一个photo这是一个复杂的对象。在emberjs.com上,他们建议使用嵌入式模型。好的,到目前为止一切顺利,我决定创建以下模型:

App.Dish = DS.Model.extend({
  name: DS.attr('string'),
  price: DS.attr('number'),
  category_id: DS.attr('number'),
  photo: DS.belongsTo('photo')
});

App.Photo = DS.Model.extend({
  origin: DS.attr('string'),
  resize: DS.attr('string')
});

但即使添加此代码

也无效
DS.RESTAdapter.map('App.Dish',{
    photo: {
        embedded:'always'
    }
});

所以在那之后我用谷歌搜索了this link来解释他们不再支持嵌入式记录了。

经过一番思考后,我决定将photo.originphoto.resize带到RESTSerializer内的JSON顶层,现在我有了这个完全正常工作的模型:

App.Dish = DS.Model.extend({
  name: DS.attr('string'),
  price: DS.attr('number'),
  category_id: DS.attr('number'),
  photo_origin: DS.attr('string'),
  photo_resize: DS.attr('string')
});

并使用RESTSerializer JSON进行了轻微转换:

{
  "dishes":
  [
    {
      "id": 251,
      "name": "Borsch",
      "category_id": 47,
      "price": "135.0",
      "photo_origin": "/path/to/origin.png",
      "photo_resize": "/path/to/resize.png"
      }
    },
    // A lot of other dishes
  ]
}

现在我有几个问题。我的方法可以接受吗?如果不是,我如何处理嵌套对象的复杂JSON?如果是,我如何使用深层嵌套(如五个级别)对象处理一些更复杂的JSON?为什么ember停止支持嵌入式模型?

1 个答案:

答案 0 :(得分:1)

与第一个示例中创建的关系不同,您没有嵌入值。

现在我不知道你是否可以控制服务器的JSON输出,但是通过使用关系,EmberJS会希望你的JSON以这种方式构建(取决于你的EmberData适配器)。

{
  dish: [{
    "id": 251,
    "name": "Borsch",
    "category_id": 47,
    "price": "135.0",
    "photos": [1]
  }],
  photo: [{
    "id": 1
    "origin": "/path/to/origin.png",
    "resize": "/path/to/resize.png"
  }] 
}

现在Ember将创建Dish和Photo,并将它们绑定在一起。

我认为这是处理它的正确方法。