Ember.js 2013-01-06 w/ Ember Data

Based on latest version of Ember.js with the new router. (latest ember build from 2013-01-06) Also including latest master of Ember Data (2013-01-06)

by jdcravens

HTML

<script src="https://github.com/downloads/wycats/handlebars.js/handlebars-1.0.rc.1.js"></script>
<script src="https://gist.github.com/raw/4469745/b102ee742d0c014bdb21715525255069d0b828bb/ember-latest-201301062045.js"></script>
<script src="https://gist.github.com/raw/8002d19b860a9dcd0f89/1b8ed4a66ef696c537466e6dd23fdb76dc804b57/ember-data-latest-2013-01061909.js"></script>
<script type="text/x-handlebars" data-template-name="application">
  <h1>Users</h1>
  
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="home">
  {{#each user in controller}}
    <h2>{{user.username}}</h2>

    <ul>
      {{#each item in user.items}}
      <li>{{item.number}}</li>
      {{/each}}
    </ul>

    <p>and reversed</p>

    <ul>
      {{#each item in user.reversedItems}}
      <li>{{item.number}}</li>
      {{/each}}
    </ul>
    <a {{action "addItem" user}} href="#">add item</a>
  {{/each}}
</script>

JavaScript

App = Ember.Application.create();

App.ApplicationController = Ember.Controller.extend();
App.ApplicationView = Ember.View.extend({
  templateName: 'application'
});

App.Store = DS.Store.extend({
  revision: 11,
  adapter: "DS.FixtureAdapter"
});

App.User = DS.Model.extend({
  username: DS.attr("string"),  
  items: DS.hasMany("App.Item"),
  
// Uncomment the first line to see the issue. If you add more than two items,
// it will fail with "Cannot read property 'clientId' of undefined".
  reversedItems: function() {
//    return this.get("items").reverseObjects();
    return this.get("items").toArray().reverseObjects();
  }.property("items.@each"),
  

  // add new number with value double of the previous one
  addNewItem: function () {
    var newRecord;
    
    if (this.get("items.length") == 0) {
      newRecord = App.Item.createRecord({ number: 1 });
    } else {
      var newNumber = this.get("items.lastObject.number") * 2;
      newRecord = App.Item.createRecord({ number: newNumber });
    }
    this.get("items").pushObject(newRecord);
  }
});

App.HomeController = Ember.ArrayController.extend({
  addItem: function(user) {
    user.addNewItem();
  }
});

App.User.FIXTURES = [ { id: 1, username: "johndoe" } ];

App.Item = DS.Model.extend({
  user: DS.belongsTo("App.User"),
  number: DS.attr("number")
});

App.Router = Ember.Router.extend();
App.Router.map(function (match) {
  match("/").to("home");
});

App.HomeRoute = Ember.Route.extend({
  model: function() {
    return App.User.find();
  }
});