渲染到现有模板时的Ember控制器

时间:2014-04-11 17:59:53

标签: javascript ember.js

我正在阅读Ember教程并且它运行良好,但我无法弄清楚它的一个方面。

Show Only Completed Todos

Todos.Router.map(function () {
  this.resource('todos', { path: '/' }, function () {  // Index route
    // additional child routes
    this.route('active');       // Implicit this.route("active", { path: "/active" });
    this.route('completed');    // Implicit this.route("completed", { path: "/completed" });
  });
});

...

Todos.TodosCompletedRoute = Ember.Route.extend({
  model: function() {
    return this.store.filter('todo', function(todo) {
      return todo.get('isCompleted');
    });
  },
  renderTemplate: function(controller) {
    this.render('todos/index', {controller: controller});
  }
});

对我来说,我们正在重用现有模板并简单地更改已分配的模型,在这种情况下,将其限制为已完成的待办事项列表。

我不明白的是要渲染的{controller: controller}参数。

根据Chrome中的Ember检查员,无论是否有{controller: controller}参数,控制器都是TodosCompletedController

如果存在{controller: controller}参数,则转到应用程序路径(在我的情况下为file:///Users/dpwrussell/Checkout/web/ember/TodoMVC/index.html#/,然后单击“已完成”会导致正确的响应,仅显示已完成的待办事项。

如果没有{controller: controller}参数,单击“已完成”链接将显示完整的待办事项列表,而不仅仅是已完成的待办事项。

最后,如果直接转到网址file:///Users/dpwrussell/Checkout/web/ember/TodoMVC/index.html#/completed,则会显示只有已完成的待办事项的正确列表,而不管{controller: controller}是否缺失,但如果您转到全部,则再次使用已完成链接,它将再次停止工作。

jsbin displaying the problem

jsbin showing how it works if you go directly to completed url

由于

1 个答案:

答案 0 :(得分:0)

您可以查看路线的renderrenderTemplate方法,以便更好地理解。如果未在this.render('todos/index', {controller: controller})中指定控制器,则Ember将创建并使用TodosCompletedController,因为路由是TodosCompletedRoute。参数' controller'不是TodosController,它是生成的TodosCompletedController。即使在调用render时未通过控制器,一切都应该正常工作。这是JSBIN