JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://raw.github.com/wycats/handlebars.js/1.0.0-rc.3/dist/handlebars.js"></script>
<script src="https://raw.github.com/emberjs/ember.js/release-builds/ember-1.0.0-rc.1.js"></script>
<script src="https://gist.github.com/hashg/4979893/raw/a0d985c57feede20fd9cdc363d0f9d09e3cfd40f/ember-data.js"></script>
<script type="text/x-handlebars" data-template-name="application">
<div id="top">
<div id="container">
{{outlet}}
</div>
</div>
</script>
<script type="text/x-handlebars" data-template-name="index">
<div>{{name}}</div>
</script>
<script type="text/x-handlebars" data-template-name="contacts">
<div id="sidebar">
{{#linkTo 'contacts.new'}}<button class='btn btn-primary'>Add contact</button>{{/linkTo}}
<ul>
{{#each contact in controller}}
<li>
{{#linkTo contact contact}} {{contact.name}} {{/linkTo}}
</li>
{{/each}}
</ul>
</div>
<div id="content">
{{outlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="contacts/new">
<form {{action save on="submit"}}>
{{partial "contact_fields"}}
<button class='btn btn-success' type="submit">Save contact</button>
</form>
</script>
<script type="text/x-handlebars" data-template-name="contact">
<form {{action save on="submit"}}>
{{partial "contact_fields"}}
<button class='btn btn-success' type="submit">Update contact</button>
<button class='btn btn-danger' {{action destroyRecord}}>delete contact</button>
<hr>
<h5>Tags</h5>
{{#each tags}}
<li>{{name}}</li>
{{/each}}
<h5>Addresses</h5>
{{#each addresses}}
<li>{{street}}, {{country}}</li>
{{/each}}
</form>
</script>
<script type="text/x-handlebars" data-template-name="_contact_fields">
{{view Ember.TextField valueBinding="name" id="name" placeholder="name" required="true"}}<br />
</script>
CSS
#container {
width: 100%;
}
#sidebar {
float: left;
width: 300px;
}
#content {
margin-left: 300px;
}
h5{
margin: 0px;
}
}
JavaScript
(function(){
window.App = Ember.Application.create();
App.Router.map(function(){
this.resource('contacts', function() {
this.route('new');
this.resource('contact', {path: ':contact_id'}, function(){
});
});
});
App.IndexRoute = Ember.Route.extend({
redirect: function(){
return this.transitionTo('contacts');
}
});
App.ContactsRoute = Ember.Route.extend({
model: function() {
return App.Contact.find();
}
});
App.ContactsNewRoute = Ember.Route.extend({
setupController: function(controller) {
controller.newRecord();
}
});
App.ContactController = Ember.ObjectController.extend({
save: function() {
this.get('store').commit();
this.get('target.router').transitionTo('contacts.index');
},
destroyRecord: function() {
if (window.confirm("Are you sure you want to delete this project?")) {
this.get('content').deleteRecord();
this.get('store').commit();
this.get('target.router').transitionTo('contacts.index');
}
}
});
App.ContactsNewController = Ember.ObjectController.extend({
newRecord: function() {
this.set('content', App.Contact.createRecord({name: "new name"}));
},
save: function() {
this.get('store').commit();
this.get('target.router').transitionTo('contacts.index');
}
});
var attr = DS.attr, belongsTo = DS.belongsTo, hasMany = DS.hasMany;
App.Store = DS.Store.extend({
revision: 12,
adapter: 'DS.FixtureAdapter'
});
App.Contact = DS.Model.extend({
name: attr('string'),
tags: hasMany('App.Tag'),
addresses: hasMany('App.Address')
});
App.Address = DS.Model.extend({
street: attr('string'),
country: attr('string'),
contacts: belongsTo('App.Contact')
})
App.Tag = DS.Model.extend({
name: attr('string'),
contacts: hasMany('App.Contact')
});
App.Contact.FIXTURES = [{
id: '1',
name: 'Alpha',
tags: ['1','2'],
addresses: ['1']
},{
id: '2',
name: 'Roger',
tags: ['2','3'],
...