I am getting my feet wet with Ember. I have followed Zoltan Debre’s excellent tutorial on www.yoember.com. It all looks very promising and I quickly got the hang of the basics. (For those who don’t know the tutorial, it lets you create a library system with books and authors.)
I decided to give myself a little challenge and created a page that lists all the books. I was pleasantly surprised to see I got it to work in minutes. Now, for the next challenge, I wanted a filter text box: one that will reduce the list while you type. That seemed a challenge indeed…
My problem basically is that I don’t know how to connect all the dots. Where do I put what code? I have a book-filter component which receives the filter term. It then uses sendAction() to trigger an action in my route. But then what? It’s all quite a black box.
Things that I have considered:
- A controller for books/index. The offical docs sort of discourage the use of controllers.
- Computed properties, but where?
I would really appreciate if someone nudged me in the right direction. Here’s some code to clarify:
//app/routes/books/index.js
export default Ember.Route.extend({
model() {
return this.store.findAll('book');
},
actions: {
filterBooks: function (filterTerm) {
console.log(filterTerm); //this prints whatever I have typed in the filter box
}
}
});
//app/templates/books/index.hbs
<h2>List</h2>
{{book-filter doFilter='filterBooks' model=model}}
<div class="row">
{{#each model as |book|}}
<div class="col-md-4">
{{book-info item=book}}
</div>
{{/each}}
</div>
//app/components/book-filter.js
import Ember from 'ember';
export default Ember.Component.extend({
filter: '',
actions: {
filter() {
var filtertext = this.get('filter');
this.sendAction('doFilter', filtertext);
}
}
});
<!--/app/templates/components/book-filter.hbs-->
<div class="row margin-bottom">
<div class="col-md-6">
<div class="input-group">
<span class="input-group-addon">@</span>
{{input value=filter class="form-control" placeholder="Filter" }}
<span class="input-group-btn">
<button class="btn btn-default" {{action 'filter'}}>Go!</button>
</span>
</div>
</div>
</div>