Search code examples
ember.jsember-router

new ember.js routing: how to connect outlets?


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


Solution

  • 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.