Ember:命名出口错误

时间:2014-10-28 00:35:50

标签: javascript ember.js handlebars.js

我不知道为什么我的模板没有在指定的插座中呈现。这是我第一次尝试学习余烬,我被困在指定的网点上。

我想在{{outlet "sidebar"}}中呈现 sidebarTemplate ,在{{outlet "content"}}中呈现 contentTemplate ,但我一直在控制台:"处理路线时出错:帖子无法读取属性' connectOutlet'未定义的TypeError:无法读取属性' connectOutlet'未定义"

以下是我的代码的小提琴:http://jsfiddle.net/va71wwr9/

这是我的HTML:

<script type="text/x-handlebars">
  <div class="nav-container">
    <ul class="nav">
        <li>{{#link-to 'home'}}Home{{/link-to}}</li>
        <li>{{#link-to 'posts'}}Posts{{/link-to}}</li>
    </ul>
  </div>

  {{outlet}}
</script>

<script type="text/x-handlebars" id="home">
  <h1>Home screen</h1>
</script>

<script type="text/x-handlebars" id="posts">
  <h1>Posts screen</h1>
  <div class="sidebar-container">
    {{outlet sidebar}}
  </div>
  <div class="content-container">
    {{outlet content}}
  </div>
</script>

<script type="text/x-handlebars" id="sidebarTemplate">
  <p>Side bar stuff</p>
</script>

<script type="text/x-handlebars" id="contentTemplate">
  <p>content stuff</p>
</script>

这是我的JavaScript:

var App = Ember.Application.create();

App.Router.map(function() {
  this.resource('home', {path: '/'});
  this.resource('home', {path: 'home'});
  this.resource('posts', {path: 'posts'});
});

App.PostsRoute = Ember.Route.extend({
  renderTemplate: function() {
    this.render('sidebarTemplate', {
        into: 'posts',
        outlet: 'sidebar'
    });
    this.render('contentTemplate', {
        into: 'posts',
        outlet: 'content'
    });
  }
});

1 个答案:

答案 0 :(得分:4)

问题是您没有呈现posts模板。您可以在定义要渲染的路线的出口模板之前添加this.render()this._super()来解决此问题:

App.PostsRoute = Ember.Route.extend({
    renderTemplate: function() {

        // add this line
        this._super();

        this.render('sidebarTemplate', {
            into: 'posts',
            outlet: 'sidebar'
        });
        this.render('contentTemplate', {
            into: 'posts',
            outlet: 'content'
        });
    }
});

关于扩展功能的一点说明;在此特定代码中,调用this._super() 技术上与调用this.render()相同,但区别在于通过调用_super()来扩展renderTemplate 1}}功能通过将你的东西附加到方法将自己做什么,在这种情况下将调用this.render(),也许这个方法可能需要执行的另一个例程(一般来说,不是{{1如果你调用自己想做的事情的方法,在这种情况下是renderTemplate方法,你将从流程中排除这个方法可以表演。这不对或错。这实际上取决于你想要达到的目标。对于大多数情况,您应该调用render,而不是在您扩展的方法执行多项操作和/或将来执行多项操作时再次重写实现。