0

我正在尝试了解新路由器系统中的控制器。我知道它们的存在是为了装饰模型并向视图/模板呈现非永久状态以进行渲染。而且我了解 Ember 路由器用于从路由名称实例化和设置每个控制器的单个副本的约定。但这是否意味着您永远不应该拥有一个以上的控制器副本?

这是我的用例:我有一组嵌套的项目列表,它们具有复杂的非持久每项目状态(不同级别的折叠/可见嵌套,不同的编辑模式等)。我不认为这属于视图,而且它太复杂(因为嵌套)而无法保存在单例控制器中——所以我计划每个视图实例都有一个控制器实例(尽管所有相同的控制器和视图类)。这是声音吗?

第二,更简单的问题。如何访问 Ember 路由器实例化的控制器?以前,您可以这样做,App.get('router.postController')但这不再有效。

4

1 回答 1

1

第一个问题

并非所有控制器都是单例的。在某些情况下,Ember.js 会为您创建非单例控制器。

一种情况是itemController{{each}}助手一起使用时:

{{#each model itemController="post"}}
  <!-- template here -->
{{/each}}

这将为循环中App.PostController的每个项目创建一个新实例。post

另一种情况是当您使用{{render}}帮助器并将模型传递给它时:

{{render "post" firstPost}}
{{render "post" secondPost}}

这将为App.PostController每个{{render}}.

第二个问题

这取决于您想从哪里访问它们。

从路线:

this.controllerFor("post");

从另一个控制器:

App.CommentController = Ember.ObjectController.extend({
  needs: ['post'],
  test: function() {
    return this.get('controllers.post');  // this returns the post controller
  }
});

更多信息在这里:http ://emberjs.com/guides/controllers/dependencies-between-controllers/

从观点来看:

this.get('controller');
于 2013-04-11T07:31:19.810 回答