制作一个以编程方式创建的控制器委派(气泡)事件



我有一个具有许多类似视图的应用程序,我通过编程实例化这些视图来"DRY up"我的应用程序。问题是,以编程方式实例化的控制器不会进一步委托actions哈希中的操作。这一点很清楚,因为控制器无法从中导出层次结构。然而,应该有一种方法来告诉控制器它必须使用哪个父控制器来进行事件冒泡。有人知道吗?

您不应该自己初始化控制器。所有控制器初始化都应由Ember自己处理。另一个有趣的注意事项是,控制器在应用程序中是单体的。唯一的例外是在ArrayController上循环时的itemController。你可以在指南中阅读更多关于它的信息。引用指南:

在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和控制器,就像您在这里看到的那样。

重点是,我认为这样做应该是可能的,而不必自己实例化控制器。

最新更新