new ember.js routing: how to connect outlets?
Asked Answered
S

2

13

I'm confused how to connect outlets with the new router approach.

index.html:

...
<script type="text/x-handlebars" data-template-name="application">
  <h4>The application handelbar</h4>
  {{! outlet 1}}
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="index">
  <h4>The index handelbar</h4>
  {{! outlet 2 and 3}}
  {{outlet nav}}
  {{outlet main}}
</script>

<script type="text/x-handlebars" data-template-name="main">
  <h4>The main handelbar</h4>
</script>

<script type="text/x-handlebars" data-template-name="nav">
  <h4>The nav handelbar</h4>
</script>
...

app.js:

...
App.Router.map(function(match) {
  this.resource("index", { path: "/" });
  this.route("test");
});

App.IndexController = Ember.Controller.extend({
});

App.IndexView = Ember.View.extend({
  templateName: 'index'
});
...

This code renders outlet-1.

Questions:

  • Why is outlet-1 rendered? How are outlet-1 and "index" connected?
  • How can I connect outlet 2 and 3 to the same "index" site?

Thanks
miw

Shapiro answered 16/1, 2013 at 19:2 Comment(0)
C
15

You need to specify this stuff in a route handler, using the renderTemplate method (or renderTemplates method, depending on your build).

What you're not seeing is that Ember is setting quite a few defaults for you already. In fact, the defaults set by Ember have allowed you to omit the entire route handler.

App.Router.map(function(match) {
  this.resource("index", { path: "/" });
  this.route("test");
});
App.IndexRoute = Ember.Route.extend({
  renderTemplate: function() {
     this.render(); 
     /* this is the default, it will basically render the
        default template, in this case 'index', into the 
        application template, into the main outlet (i.e. your 
        outlet 1), and set the controller to be IndexController.
     */

  }
});

What you want is to render additional templates in the renderTemplate function, likeso:

  renderTemplate: function() {
     this.render("index"); 
     // this renders the index template into the primary unnamed outlet. 
     this.render("navtemplate", {outlet: "nav"}); 
     // this renders the navtemplate into the outlet named 'nav'.
     this.render("main", {outlet: "main"});
     // this renders the main template into the outlet named 'main'.
  }

Hope this helps.

Criseyde answered 16/1, 2013 at 23:26 Comment(0)
A
6

Ember automatically assumes / matches with IndexRoute, IndexController and IndexView. This is in the ember routing guide

To connect nested routes you can do it like this:

App.OtherRoute = Ember.Route.extend({
  renderTemplate: function() {
     this.render('otherTemplate', {
      into: 'index',
      outlet: 'nav'
     }); 
  }
});

Here is a more in depth answer from another question.

Aeromechanics answered 17/1, 2013 at 2:25 Comment(1)
Thanks for your answer and the useful stackoverflow link! Sorry, cannot vote up with my low reputation.Shapiro

© 2022 - 2024 — McMap. All rights reserved.