Sideloaded saves
The latest build of Ember.
by Jeremy Gillick
HTML
<script src="http://builds.emberjs.com/handlebars-1.0.0.js"></script>
<script src="http://builds.emberjs.com/ember-latest.js"></script>
<script src="http://builds.emberjs.com/tags/v1.0.0-beta.4/ember-data.prod.js"></script>
<script type="text/x-handlebars" data-template-name="index">
<button {{action "save"}}>Save</button>
</script>
JavaScript
App = Ember.Application.create({});
App.Child = DS.Model.extend({
name: DS.attr('string'),
toys: DS.hasMany('toy'),
});
App.Toy = DS.Model.extend({
kind: DS.attr('string'),
size: DS.belongsTo('size'),
features: DS.hasMany('feature')
});
App.Size = DS.Model.extend({
height: DS.attr('number'),
width: DS.attr('number'),
depth: DS.attr('number')
});
App.Feature = DS.Model.extend({
name: DS.attr('string')
});
DS.RESTAdapter.reopen({
sideloadRecord: function(store, record, data) {
var type = record.constructor.typeKey,
id = Ember.get(record, 'id'),
listKey = type.pluralize(),
itemData = {};
// Create side loaded list
if (!data[listKey]) {
data[listKey] = [];
}
// Already side loaded
if (data[listKey].findBy('id', id) != undefined) {
console.log('return');
return data;
}
data[listKey].push( record.serialize({includeId: true}) );
this.sideloadRelationships(store, record, data);
return data;
},
sideloadRelationships: function(store, record, data) {
// Sideload relationships
record.eachRelationship(function(key, relationship) {
var related = Ember.get(record, key);
// Belongs to
if (relationship.kind === 'belongsTo') {
this.sideloadRecord(store, related, data);
}
// Has many
if (related && relationship.kind === 'hasMany') {
related.forEach(function(item, index){
this.sideloadRecord(store, item, data);
}, this);
}
}, this);
},
createRecord: function(store, type, record) {
console.log('Create');
var data = {};
var serializer = store.serializerFor(type.typeKey);
serializer.serializeIntoHash(data,...