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

Ember Controller when rendering into existing template

本文关键字:Ember 控制器      更新时间:2023-09-26

我正在学习Ember教程,它运行得很好,但我不太清楚其中的一个方面。

仅显示已完成的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});
  }
});

对我来说,我们重用现有的模板并简单地更改分配的模型是有意义的,在这种情况下,将其限制在已完成的todo列表中。

我不明白的是要呈现的{controller: controller}参数。

根据Chrome中的Ember检查器,无论有没有{controller: controller}自变量,控制器都是TodosCompletedController

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

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

最后,如果直接转到url file:///Users/dpwrussell/Checkout/web/ember/TodoMVC/index.html#/completed,则无论{controller: controller}是否丢失,都会显示仅完成todo的正确列表,但如果转到All,然后使用链接再次完成,则它将再次停止工作。

jsbin显示问题

jsbin显示如果您直接转到已完成的url ,它是如何工作的

感谢

您可以查看Route的render和renderTemplate方法以获得更好的理解。如果控制器没有在this.render('todos/index', {controller: controller})中指定,那么Ember将创建并使用TodosCompletedController,因为路由是TodosCompletedRoute。参数"controller"不是TodosController,而是生成的TodosCompletedController。即使在调用render时没有传递控制器,一切都应该正常工作。这是JSBIN。