我正在努力将我的JSON“塞进”正确的格式。
为了说明这一点,我做了一个快速的JSfiddle。
http://jsfiddle.net/chrismasters/NQKvy/638/
服务器返回数据的格式与Ember Data现在推荐的首选格式有一些区别。
这是原始的JSON输出
{
"video": {
"uuid": "8a660002-03c6-4b8e-bd8b-4ce28fa0dacd",
"state": "pending",
"theme": "basic",
"resolution": "nHD",
"title": "Test title",
"track": {
"uuid": "376fc3bb-d703-49e7-9d92-bce7f6bf8b56",
"state": "complete",
"source": "upload"
}
}
}
第一个是,它使用字符串形式的UUID而不是使用ID。
我似乎已经设法使用normalizeHash至少针对视频进行了修复-但我不确定是否也可以使用相同的方法来修复轨道模型-特别是如果我根据需要使用嵌入的话。
这是开始出现大问题的地方,如果我从视频模型中注释掉EmiratesTo关系,那么它工作正常,所以我认为...显然,这是嵌入式轨道数据的JSON格式问题。
这是模型定义和序列化
App.Video = DS.Model.extend({
title: DS.attr('string'),
//track: DS.belongsTo('track', { embedded: true })
});
App.VideoSerializer = DS.RESTSerializer.extend({
normalizeHash: {
video: function(hash) {
hash.id = hash.uuid;
delete hash.uuid;
return hash;
}
}
});
我非常感谢您提供一些有关如何将此响应格式化为Ember Data可以识别的格式的建议。
另外-没有人知道调试这些序列化转换的工具或好的方法,因为目前Ember发出的错误消息对于调试或查看序列化输出是不是很有帮助。
非常感谢您提出的任何帮助。
克里斯
最佳答案
万一其他人对序列化有同样的困惑,我想我会附上一个解释如何解决这个问题的说明。
这是工作的jsbin:
http://jsbin.com/fuzu/4
要点如下:
主键
primaryKey: 'uuid'
将ID转换为正确的命名很有用,并且需要明确地将其应用于任何序列化程序(在ApplicationSerializer上全局使用似乎无效)。
模型关系
track: DS.belongsTo('track', {embedded: true} )
确保关系的定义包括仅在一侧嵌入&。
提取单个
extractSingle: function(store, type, payload, id, requestType) {
var tracks = [];
var track = payload.video.track;
var video = payload.video;
tracks.push(track);
video.track = payload.video.track.uuid;
payload = { video: video, track: tracks };
return this._super(store, type, payload, id, requestType);
}
即使模型关系是一个belongsTo,对Ember Data来说,了解多个关系确实很重要。
您可以在所需的(有效的)JSON中清楚地看到这一点
{
"video": {
"id": "8a660002-03c6-4b8e-bd8b-4ce28fa0dacd",
"state": "pending",
"theme": "basic",
"resolution": "nHD",
"title": "Test title",
"track": "2"
},
"track": [{
"id": "2",
"state": "complete",
"source": "upload"
}]
}
视频中的跟踪值不是包裹在数组中,但是根跟踪值是数组。
因此,我发现首先定义所需的JSON并首先对其进行测试,然后再尝试将实际JSON压缩为该格式非常有用。
我认为有一个工具可以帮助此过程(可视化来自序列化的实时JSON输出)可能是Ember Data的重要补充,也是我将要研究的东西。