I recently implemented a checkbox in an Ember 2.0 project that, when checked/unchecked, would call an action and change some properties.
Searching the web reveals many different approaches to this problem, some of which (depending on your project’s needs and stack) may be more suitable for you than others.
The first time I needed a checkbox to call an action in Ember, I was just building a quick ‘n dirty prototype and I wanted to keep things simple and skip observers, components, etc., which I was able to do with some basic HTML and an Ember controller.
Simple Ember checkbox HTML/JS solution
Here’s the simplest implementation of an Ember checkbox calling an action I can come up with. It’s just HTML and JavaScript.
See it working in this JSFiddle
HTML:
<input type="checkbox" id="checkbox-toggle" name="toggleCheckbox" checked=toggleChecked {{action "toggleCheckBox" on="change"}} />
JS:
setupController: function() { this.controller.set('toggleChecked', true); }, actions: { toggleCheckBox: function() { this.controller.set('toggleChecked', !this.controller.get('toggleChecked')); } }
Ember checkbox as a component
Ember offers an {{input }} component that you can now hook up to actions (that apparently wasn’t true in earlier versions of Ember, but it’s true as of this writing which uses Ember 2.0).
The input component implementation looks like this:
{{input type="checkbox" id="checkbox-policy" name="checkboxPolicy" checked=readPolicyChecked change=(action togglePolicyRead)}}
To register the action with the controller, you’ll need to add this to the corresponding .js file.
// Set a method on the controller which will send the action this.controller.set('togglePolicyRead', function() { this.send('togglePolicyRead'); });
If you don’t set this method on the controller, you’ll get a console error like:
Uncaught Error: An action could not be made for `togglePolicyRead` in (generated page.policy-review controller). Please confirm that you are using either a quoted action name (i.e. `(action 'togglePolicyRead')`) or a function available in (generated page.policy-review controller).
As an aside, using Ember’s input component to generate the checkbox will just render into normal HTML (like you see in my first example) and you can confirm that by viewing the page source on your project.
Ember checkbox as HTML with handlebars for the checked property
What if you can’t use the {{input}} component because of a conflict with handlebars syntax? Maybe you’re working inside a component, or there’s some project-specific reason you need to go this route. Here’s an approach you can try that uses HTML for the input and wraps the checked={{property}} in handlebars.
<input type="checkbox" id="checkbox-green" name="greenCheckbox" checked={{greenChecked}} {{action "toggleGreen" on="change"}}/>
With this technique, you also don’t have to set up the action on the controller like I showed in the previous technique.
The Ember project I worked on serves its templates as .jsp files and this approach was the popular because we could skip the cumbersome “send” step on the controller. Now, whether that’s “the Ember Way”, I’m too new to Ember to say, but this got the job done.
Thanks for the article. It pointed me in the right direction! But, where are you social media sharing buttons?