刚刚在看 Ember Peepcode 视频。它让我明白的一件事是控制器是单例的,因此每个控制器的单个实例是在运行时创建的,并且控制器的数据属性根据需要换入/换出。
但是,当您需要在屏幕上显示同一控制器的多个版本并同时处于活动状态时会发生什么。如果我有多个example.handlebars
模板,每个模板都需要同时由其自己的ExampleController
屏幕版本支持,会发生什么?
Ember 如何处理这种情况?
刚刚在看 Ember Peepcode 视频。它让我明白的一件事是控制器是单例的,因此每个控制器的单个实例是在运行时创建的,并且控制器的数据属性根据需要换入/换出。
但是,当您需要在屏幕上显示同一控制器的多个版本并同时处于活动状态时会发生什么。如果我有多个example.handlebars
模板,每个模板都需要同时由其自己的ExampleController
屏幕版本支持,会发生什么?
Ember 如何处理这种情况?
有几种方法可以处理(在我之前的回答中提到)。
方法一:
{{render}}
使用模型(需要最新的 Ember.js 构建):
{{render "example" example1}}
{{render "example" example2}}
方法二:
{{control}}
已从 Ember >= 1.0 中删除。{{control}}
(它仍然是越野车,所以如果可以的话,请避免)
{{control "example"}}
但首先您需要启用标志:ENV.EXPERIMENTAL_CONTROL_HELPER = true
在加载 ember.js 文件之前。
还有一个错误,您需要通过以下方式修复:
App.register('controller:example', App.ExampleController, {singleton: false }
方法三:
与. {{each}}
_itemController
{{#each controller itemController="example"}}
{{view "example"}}
{{/each}}
这些中的每一个每次都会创建一个新的单独实例。
我发现,如果您覆盖控制器的 init 方法并将内容设置为新对象(或您正在使用的任何对象),您可以拥有多个独立实例。
App.MyMultipleController = Ember.ObjectController.extend({
content: {},
init: function(){
this.set('content', {});
return this._super.call(this, arguments);
}
});
这是一个JSFiddle。出于我自己的目的,它正在使用ObjectProxy
,但ObjectController
如果你愿意,你可以使用:http: //jsfiddle.net/jgillick/D83d8/