EmberJS - Router ModalOutlet
by fangyang
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/ember.js/1.0.0-rc.2/ember.js"></script>
<script type="text/x-handlebars" data-template-name="application">
<nav>
{{#linkTo "index"}}Home{{/linkTo}}
{{#linkTo "contributors"}}Contributors{{/linkTo}}
</nav>
<div style='padding:5px;margin:5px;border:1px dotted red;'>
Default Outlet
{{outlet}}
</div>
<div style='padding:5px;margin:5px;border:1px dotted blue;'>
modalOutlet
{{outlet modalOutlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="contributors">
<ul>
{{#each contributor in controller}}
<li>{{#linkTo contributor contributor}} {{contributor.login}} {{/linkTo}}</li>
{{/each}}
</ul>
</script>
<script type="text/x-handlebars" data-template-name="contributor">
<p>
Contributor: {{login}}<br>
Contributions: {{contributions}}
<div style='clear:both;'></div>
</p>
</script>
JavaScript
//http://stackoverflow.com/questions/15972226/ember-js-rendering-outlet-as-a-modal-window?rq=1
var App = Ember.Application.create();
// Router
App.Router.map(function(){
this.resource('contributors', function() {
this.resource('contributor', {path: '/:contributor_id'});
});
});
// Route
App.IndexRoute = Ember.Route.extend({
setupController: function(controller) {
this.transitionTo('contributors');
}
});
App.ContributorsRoute = Ember.Route.extend({
model: function() {
return App.Contributor.all();
},
});
App.ContributorRoute = Ember.Route.extend({
renderTemplate: function() {
this.render('contributor', {
into: 'application',
outlet: 'modalOutlet'
});
}
});
// Fetch the data from Github Api
App.Contributor = Ember.Object.extend();
App.Contributor.reopenClass({
allContributors: [], // class variable
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(App.Contributor.create(contributor))
}, this);
}
});
return this.allContributors;
}
});