我有一个具有许多相似视图的应用程序,我以编程方式实例化为“干掉”我的应用程序。
问题是以编程方式实例化的控制器不会进一步委托actions
哈希中的操作。这很清楚,因为控制器无法从中派生层次结构。但是,应该有一种方法告诉控制器它必须使用哪个父控制器进行事件冒泡。有谁知道吗?
答案 0 :(得分:2)
您不应该自己初始化控制器。所有控制器初始化都应由Ember本身处理。另一个有趣的注意事项,控制器应该是应用程序中的单例。在循环ArrayController时,唯一的例外是itemController。您可以阅读更多相关信息in the guides。引导指南:
在Ember.js应用程序中,您始终将控制器指定为 类,框架负责实例化它们 将它们提供给您的模板。
这使得测试控制器变得非常简单,并确保了这一点 您的整个应用程序共享每个控制器的单个实例。
更新1:
如何为向导进行路由的示例:
App.Router.map(function() {
this.resource('wizard', function() {
this.route('step1');
this.route('step2');
this.route('step3');
});
});
这样,您可以在向导的每个步骤中拥有单独的控制器/视图/模板。如果您在转换到下一步之前有多少步骤应该完成,那么您可以在各个路径中处理它。
更新2:
如果步骤数没有预先确定,但是基于提供给应用程序的数据,您可以创建一个WizardController,它是一个ArrayController,其中数组中的每个项目都是向导中的一个步骤。然后,使用ArrayController上的lookupItemController
挂钩,有点像这样:
App.WizardRoute = Ember.Route.extend({
model: function() {
return [
{controllerName: 'step1', templateName: 'step1'},
{controllerName: 'step2', templateName: 'step2'},
{controllerName: 'step3', templateName: 'step3'}
];
}
});
App.WizardController = Ember.ArrayController.extend({
lookupItemController: function(modelObject) {
return modelObject.controllerName;
}
});
{{#each step in controller}}
{{view Ember.View templateName=step.templateName}}
{{/each}}
作为另一种可能更好的替代方法,您可以在路由中覆盖renderTemplate挂钩,在该路径中,您将向下拉动模型以进行向导中的下一步,并在渲染调用中传入相应的templateName和控制器,和你一样see here。
重点是,我认为应该可以在不必自己实例化控制器的情况下这样做。