Ember Data Example

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.Post = DS.Model.extend({
    title: DS.attr('string'),
    comments: DS.hasMany('comment', {embedded: 'always'}),
});
App.Comment = DS.Model.extend({
    post: DS.belongsTo('post'),
    body: DS.attr('string')
});

DS.JSONSerializer.reopen({
    serializeBelongsTo: function(record, json, relationship) {
        var key = relationship.key,
            belongsTo = Ember.get(record, key);
        key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
        
        if (relationship.options.embedded === 'always') {
            json[key] = belongsTo.serialize();
        }
        else {
            return this._super(record, json, relationship);
        }
    },
    serializeHasMany: function(record, json, relationship) {
        var key = relationship.key,
            hasMany = Ember.get(record, key),
            relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
        
        if (hasMany && relationship.options.embedded === 'always') {
            json[key] = [];
            hasMany.forEach(function(item, index){
                json[key].push(item.serialize());
            });
        }
        else {
            return this._super(record, json, relationship);
        }
    }
});

App.IndexController = Em.ObjectController.extend({
    actions: {
        save: function(){
            var store = this.get('store'),
                post, comment;
            
            post = store.createRecord('post', {
                id: 1,
                title: 'Soylent Green is People'
            });
            comment = store.createRecord('comment', {
                post: post,
                body: 'It\'s only a conspiracy, get your facts straight.'
            });
            
            post.get('comments').pushObject(comment);
            console.log(post.serialize());
        }
    }    
});