Build a static site with Ember.js part 2
TLDR
Yesterday I wrote Build a static site with Ember.js. This morning I saw this fine post on Twitter which shows how to create a rudimentary model and dynamic segments on urls so I figured I'd take that code and flesh out my example.
You can see the live example of this code on heroku and you can get a copy of this code by cloning this repo on github.
Update your Routes
Open app/assets/javascripts/router.js
and add the following two routes.
this.route("contributors")
this.route("contributor", { path : "/contributors/:contributor_id" })
The first route should look familiar from part 1. The second path maps to a
contributor
route. Notice :contributor_id
. This is what's called a 'dynamic segment' in Ember.js.
Create the contributor
model
Open app/assets/javascripts/models/contributors_model.js
EmberStatic.Contributor = Ember.Object.extend();
EmberStatic.Contributor.reopenClass({
allContributors : [],
all : function(){
this.allContributors = [];
$.ajax({
url : 'https://api.github.com/repos/emberjs/ember.js/contributors',
dataType : 'jsonP',
context : this,
success : function(response){
response.data.forEach(function(contributor){
this.allContributors.addObject(EmberStatic.Contributor.create(contributor));
}, this);
}
});
return this.allContributors;
}
});
This just creates a Contributor
object which extends the core EmberJS
Object
. It then adds an all
method which makes a GET
request to github
asking for a list of all contributors to EmberJS.
If the GET
request is successful the response
is looped over and added to
the allContributors
array via Ember.MutableEnumerable's
addObject
method passing in an Object created by calling Ember.Object
's create method.
Wire in the Model
Now we customize our route to tell it about our model. Open
app/assets/javascripts/routes/contributors_route.js
and add
EmberStatic.ContributorsRoute = Ember.Route.extend({
model : function(){
return EmberStatic.Contributor.all();
}
});
Now the contributor
route is associated with the Contributor
model and all
method.
Create a contributors
template
Create and open app/assets/javascripts/templates/contributors.hbs
and add
<p>Contributors</p>
<ul>
{ { #each contributor in controller} }
<li>{ { #linkTo contributor contributor } } { { contributor.login } } { { /linkTo } }</li>
{ { /each } }
</ul>
Because the previous step made the connection between contributor
and the
Contributor
's all
method in this template we can do a handlebars each
method to loop over the contributors array and create a list item for each
contributor.
The handlebars #linkTo
takes two arguments. First the route and second the id
of the contributor. The text of the generated link will be the user's github
login name.
Create a contributor
template
In the Route file we create a route for contributors
and contributor
so
we'll need to create a template for contributor
as well.
Create and open app/assets/javascripts/templates/contributor.hbs
and add:
Contributor: { { login } }, contributions: { { contributions } }
And that's all the code you need to write.
Thanks for reading! Follow me on Twitter and/or G+ for more.
See something wrong or got something to add/change? Fork this git repo and send me a pull request
If you particularly enjoy my work, I appreciate donations given with Gitcoin.co