On Friday I gave a presentation at EmberFest. The talk was framed by having worked on several Ember codebases, including one for almost 9 months. I’ve found that new Ember developers (or even experienced ones!) tend to lean heavily on feature-rich controllers to architect their applications- this works for a time, but as a codebase grows in complexity the controllers become unwieldy and confusing.

The fantastic Luke Melia must be thinking the same thing, because in RC8 he landed a change of the events hash to be called actions. This cosmetic change is almost a distraction from the real change: A refactoring of how controllers, routes, and views handle actions.

There is now an Ember.ActionHandler mixin that unifies the behavior. Check it out:

var Actionable = Ember.Object.extend(Ember.ActionHandler);

var secondTarget = Actionable.extend({
  actions: {
    "Wie Ghet's": function(){
     console.log("Und dir?");
    }
  }
}).create();

var firstTarget = Actionable.extend({
  target: secondTarget,
  actions: {
    "Wie Ghet's": function(){  // If actions was undefined or this action didn't exist, only secondTarget would handle it.
      console.log("Danke gut");
      return true; // If you return true, the event will continue to bubble.
    }
  }
}).create();

firstTarget.send("Wie Ghet's");


// Danke gut
// Und dir?

Having this behavior consistent, especially the logic behind when to bubble an action or not, is incredibly important. Thanks Luke!

I find that most successful Ember projects follow a simple pattern for application design:

  • Controllers present information to templates. And not much else, ideally.
  • Actions are handled on routes. This makes routes (which can access models and arbitrary controllers via controllerFor) and controllers each responsible for a different set of concerns.

The result is better and more maintainable code. Here are the slides from the talk:

Rumor has it that we may have video soon, I’ll update this post when they are published.

Update: Many thanks to Luke Melia for catching a few bugs in the code samples!

Update 2: Now with video from the NYC meetup.