Jer*_*ick 12 json ember.js ember-data
我需要一次性将一个深层对象保存到服务器,并且无法在线找到任何使用最新ember数据(1.0.0-beta.4)的示例.
例如,使用这些模型:(jsfiddle)
App.Child = DS.Model.extend({
name: DS.attr('string'),
age: DS.attr('number'),
toys: DS.hasMany('toy', {async:true, embedded:'always'}),
});
App.Toy = DS.Model.extend({
name: DS.attr('string'),
child: DS.belongsTo('child')
});
Run Code Online (Sandbox Code Playgroud)
这段代码:
actions: {
save: function(){
var store = this.get('store'),
child, toy;
child = store.createRecord('child', {
name: 'Herbert'
});
toy = store.createRecord('toy', {
name: 'Kazoo'
});
child.set('toys', [toy]);
child.save();
}
}
Run Code Online (Sandbox Code Playgroud)
它只保存子对象的JSON,但不保存任何玩具 - 甚至没有侧载:
{
child: {
age: null
name: "Herbert"
}
}
Run Code Online (Sandbox Code Playgroud)
我是否还必须手动保存玩具?无论如何,我可以让它将以下JSON发送到服务器:
{
child: {
age: null
name: "Herbert",
toys: [{
name: "Kazoo"
}]
}
}
Run Code Online (Sandbox Code Playgroud)
要么
{
child: {
age: null
name: "Herbert",
toys: [1]
}
}
Run Code Online (Sandbox Code Playgroud)
见JSFiddle:http://jsfiddle.net/jgillick/LNXyp/2/
这里的答案已经过时了.Ember Data现在支持嵌入式记录,这使您可以完成您想要做的事情,即在一个大的有效负载中获取和发送完整的对象图.例如,如果您的模型设置如下:
App.Child = DS.Model.extend({
name: DS.attr('string'),
age: DS.attr('number'),
toys: DS.hasMany('toy')
});
App.Toy = DS.Model.extend({
name: DS.attr('string'),
child: DS.belongsTo('child')
});
Run Code Online (Sandbox Code Playgroud)
您可以为Child模型定义自定义序列化程序:
App.ChildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
toys: {embedded: 'always'}
}
});
Run Code Online (Sandbox Code Playgroud)
这告诉Ember Data您希望将"玩具"作为"子"有效载荷的一部分.您的API的HTTP GET响应应如下所示:
{
"child": {
"id": 1,
"name": "Todd Smith",
"age": 5,
"toys": [
{"id": 1, "name": "boat"},
{"id": 2, "name": "truck"}
]
}
}
Run Code Online (Sandbox Code Playgroud)
当您保存模型时,Ember Data会将其发送到服务器:
{
"child":{
"name":"Todd Smith",
"age":5,
"toys":[
{
"id":"1",
"name":"boat",
"child":"1"
},
{
"id":"2",
"name":"truck",
"child":"1"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个演示这个的JSBin.
http://emberjs.jsbin.com/cufaxe/3/edit?html,js,output
在JSbin中,当您单击"保存"按钮时,您将需要使用Dev Inspector来查看发送到服务器的请求.
我需要一个深层对象,而不是侧面加载的对象,所以根据 kingpin2k 的答案,我想出了这个:
DS.JSONSerializer.reopen({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key,
property = Ember.get(record, key),
relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
if (property && relationshipType === 'manyToNone' || relationshipType === 'manyToMany' ||
relationshipType === 'manyToOne') {
// Add each serialized nested object
json[key] = [];
property.forEach(function(item, index){
json[key].push(item.serialize());
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
现在当你调用 时child.serialize(),它将返回这个对象:
{
child: {
name: "Herbert",
toys: [
{
name: 'Kazoo'
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我需要的。这是 jsfiddle 的实际操作:http://jsfiddle.net/jgillick/LNXyp/8/
| 归档时间: |
|
| 查看次数: |
6114 次 |
| 最近记录: |