【问题标题】:Multiple Instances of the Same Controller Simultaneously in Ember在 Ember 中同时存在同一个控制器的多个实例
【发布时间】:2013-03-20 06:46:44
【问题描述】:

刚刚观看了 Ember Peepcode 视频。它让我明白的一件事是控制器是单例的,因此每个控制器的单个实例是在运行时创建的,并且控制器的数据属性会根据需要换入/换出。

但是,当您需要在屏幕上显示同一控制器的多个版本并同时处于活动状态时会发生什么情况。如果我有多个example.handlebars 模板,每个模板都需要同时在屏幕上由其自己的ExampleController 版本支持,会发生什么情况?

Ember 如何处理这种情况?

【问题讨论】:

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


    【解决方案1】:

    有几种方法可以处理(在我的previous answer 中提到)。

    方法一:

    {{render}} 带有模型(需要最新的 Ember.js 版本):

    {{render "example" example1}}
    {{render "example" example2}}
    

    方法二:

    2014 年 7 月 7 日更新:{{control}} 已从 Ember >= 1.0 中删除。

    {{control}}(它仍然有问题,所以尽量避免)

    {{control "example"}}
    

    但首先你需要在加载 ember.js 文件之前启用标志:ENV.EXPERIMENTAL_CONTROL_HELPER = true

    还有一个你需要修复的错误:

    App.register('controller:example', App.ExampleController, {singleton: false }
    

    方法三:

    {{each}}itemController 一起使用。

    {{#each controller itemController="example"}}
      {{view "example"}}
    {{/each}}
    

    每次都会创建一个新的单独实例。

    【讨论】:

    • 但是当我必须访问其中一个控制器时会发生什么。我该怎么做?例如,如果我必须从路由中为控制器设置一些值,我可能必须使用 controllerFor 方法,但它仅适用于单例控制器。
    • 您可以将该控制器上的值绑定到单例控制器。通过更新单例,该控制器上的属性将同步。
    • 但在这种情况下,当那个单例控制器更改值时,我的所有控制器都将收到更新。所有人都会回应,但我只需要一个具体的。而且,当我的更改从控制器波动到单例控制器时,这种方法有效,但反之则不行。
    • jsbin 中的这种情况的示例会有所帮助。
    • jsbin.com/igozob/9/edit 在这个例子中,单击是内部处理的,但双击必须与单例控制器的路由器通信,因此不会更新
    【解决方案2】:

    我发现,如果您覆盖控制器的 init 方法并将内容设置为新对象(或您正在使用的任何对象),您可以拥有多个独立实例。

    App.MyMultipleController = Ember.ObjectController.extend({
        content: {},
    
        init: function(){
            this.set('content', {});
            return this._super.call(this, arguments);
        }
    });
    

    这是一个 JSFiddle。它使用ObjectProxy,出于我自己的目的,但如果你愿意,你可以使用ObjectControllerhttp://jsfiddle.net/jgillick/D83d8/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多