One of the reasons that Ember.js is so powerful of a framework is because of its Router, and ultimately its bet on the web and the fact that the URL is important. With Ember's router, the URL becomes a nested state-machine for your app, which is one of the reasons you should be using URLs in your app whenever you can. Let me explain a bit.
I'm just learning about state-machines, and from what I can tell one of the basics is that in the most simplest of state-machines, you represent a single state that can happen at one time. So for example, fetching
or errored
for an AJAX request, you cannot be in both states. Ember.js gives you these two for free in the router, the loading
and errored
routes (or substates as the guides call them).
The way that Ember has routes and UI setup promotes these exclusive states in the UI, because nested routes map to nested UI. So if you have a wizard UI for an onboarding kind of experience, you can model each step of that onboarding flow as a nested route:
this.route('onboarding', function () {
// 'index' is predefined and is step 0
this.route('step1');
this.route('step2');
this.route('step3');
// 'loading' is predefined
// 'errored' is predefined
});
As you can see, if you visit onboarding
you will land on the index
route, which can be step 0 or can redirect you to the correct step. This is the initial state of our onboarding state-machine. If the index
route loads something, it will transition to loading
before rendering. So you can only be in one of the substates of the onboarding
route.
You can now transition from index
to another sibling route using transitionTo
on the router
service or on routes (transitionToRoute
in a controller). Something like this.router.transitionTo('onboarding.step1')
. Once again loading
and maybe errored
will be entered during/after the model
loading phase. Using this structure to define nested UI, since the child routes are nested in whatever UI is defined in the onboarding
template, allows you to define exclusive states and prevents subtle bugs that might creep up if you decided to handle these steps using {{#if (eq this.step 'step1')}}
syntax, especially if you have multiple if statements for the same state for different pieces of UI, it makes it hard to reason about and allows your app to be in unknown states you didn't intent.
So in closing, the URL is important, because it drives nested UI in a state-machine fashion which keeps your app easier to understand, read, and prevents bugs in many cases.
If you want to read more about routing, check out my post about Using Nested Routes In Ember.
Top comments (0)