我正在使用简单的餐厅菜单,我从服务器收到以下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.origin
和photo.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停止支持嵌入式模型?
答案 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,并将它们绑定在一起。
我认为这是处理它的正确方法。