I’m creating a router-based EmberJS app (strongly modelled on the excellent router guide). However, I’m quite muddled over what belongs in a view vs in a controller.
I totally get that {{action showFoo}} often indicates a state change and that the Router is the state machine for my app. But some of my actions don’t fall into that category.
Here’s an example from my actual code (html simplified but mustaches intact). I want to have a login form that works via ajax (i.e. the html form doesn’t post directly to the server, it tells my ember app to attempt a login via json).
<form>
Email Name: {{view Ember.TextField valueBinding="email"}}
Password: {{view Ember.TextField valueBinding="password"}}
<button type="submit" {{ action logIn target="this" }}>Sign in</button>
</form>
The valueBindings are fields in my loginController but the logIn handler is in my view (because I couldn’t figure out how to tell the template to call the controller). I feel like this is a weird distribution & I’m not sure what the right Ember approach is to this.
I don’t think the router should be handling the action because requesting a login attempt isn’t really a state change. The loginController feels like the right place to try the login. After a login response is received then that controller could trigger the state change.
I think that’s exactly the case: attempting a login should transition to an
authenticatingstate, where for example another click to “login” is ignored.So IMHO this should be handled by the router. I’m thinking about something like this, see http://jsfiddle.net/pangratz666/97Uyh/:
Handlebars:
JavaScript: