【问题标题】:Ember.js accessing and organizing controllers with new routerEmber.js 使用新路由器访问和组织控制器
【发布时间】:2013-04-03 06:53:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: model-view-controller ember.js ember-router


    【解决方案1】:

    第一个问题

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

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

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

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

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

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

    这将为每个{{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
      }
    });
    

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

    从外观上看:

    this.get('controller');
    

    【讨论】:

    • 谢谢,这很有帮助。至于第二个问题,有没有办法从全局上下文中访问控制器,例如在控制台中?
    • 是的,App.__container__.lookup('controller:post'),但仅在测试中,请勿在您的应用中使用它。
    • 是因为这违背了 Ember 的预期范围吗?真的没有您想要访问路由、视图或控制器之外的控制器的情况吗? (我现在想不出一个,但我不知道......也许在非单例非路由器实例化控制器的情况下)
    • 我使用 Ember.js 已经有一段时间了,我不需要从这三个类之外访问控制器。至于访问非单例控制器,全局访问它们没有多大意义,因为您必须使用某种标识符标识每个实例才能从全局范围内获取它...container.lookup('post') 不会无论如何都不够。
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多