Model view controller Ember.js使用新路由器访问和组织控制器

Model view controller Ember.js使用新路由器访问和组织控制器,model-view-controller,ember.js,ember-router,Model View Controller,Ember.js,Ember Router,我试图了解新路由器系统中的控制器。我知道它们的存在是为了装饰模型,并向视图/模板呈现非永久状态以进行渲染。我了解Ember路由器用于实例化和设置路由名称中每个控制器的单个副本的约定。但这是否意味着您永远不应该拥有一个以上的控制器副本 下面是我的用例:我有一组嵌套的项目列表,每个项目状态都是复杂的非持久性的(不同级别的折叠/可见嵌套、不同的编辑模式等)。我认为这不属于视图,而且它太复杂(因为嵌套),无法保存在一个单例控制器中——所以我计划每个视图实例有一个控制器实例(尽管都是相同的控制器和视图类)

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

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


第二,更简单的问题。如何访问Ember router实例化的控制器?以前,你可以使用App.get('router.postController'),但现在已经不起作用了。

第一个问题

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

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

{{#each model itemController="post"}}
  <!-- template here -->
{{/each}}
这将为每个
{render}
创建一个单独的
App.PostController
实例

第二个问题

这取决于您想从何处访问它们

从路线:

this.controllerFor("post");
从另一个控制器:

App.CommentController = Ember.ObjectController.extend({
  needs: ['post'],
  test: function() {
    return this.get('controllers.post');  // this returns the post controller
  }
});
更多信息请点击此处:

从这个角度来看:

this.get('controller');

谢谢,这很有帮助。至于第二个问题,是否有一种方法可以从全局上下文访问控制器,例如在控制台中?是的,
App.\uuu容器\uuuuu.lookup('controller:post')
,但仅在测试中,不要在你的应用程序中使用它。这是因为这会破坏Ember的预期范围吗?您真的不希望访问路由、视图或控制器之外的控制器吗?(我现在想不出一个,但我不知道..也许在非单例非路由器实例化控制器的情况下)我已经使用Ember.js很长一段时间了,我不需要从这三个类之外访问控制器。至于访问非单例控制器,全局访问它们没有多大意义,因为您必须用某种标识符标识每个实例,以便从全局范围获取它<代码>容器。无论如何,查找('post')是不够的。
this.get('controller');