以编程方式创建控制器委托(气泡)事件

时间:2014-01-14 11:19:31

标签: ember.js

我有一个具有许多相似视图的应用程序,我以编程方式实例化为“干掉”我的应用程序。 问题是以编程方式实例化的控制器不会进一步委托actions哈希中的操作。这很清楚,因为控制器无法从中派生层次结构。但是,应该有一种方法告诉控制器它必须使用哪个父控制器进行事件冒泡。有谁知道吗?

1 个答案:

答案 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

重点是,我认为应该可以在不必自己实例化控制器的情况下这样做。