6

快速上下文:应用程序视图有 2 个出口。一个用于工具栏。另一个用于可路由的“主”视图层次结构。

app -- main
   \-- toolbar

我需要工具栏中的一些按钮来触发“主”视图中的事件。不更新任何模型中的任何数据。我只是指示它触发对视图呈现的绘图库的一些更改。清除画布,重置缩放值等。

在 1.0 pre2 和更早的版本中,我使用了操作和 router.get('someController.view') 来访问我想要的视图并触发操作/方法/事件。几乎不是应用程序设计的巅峰之作,但它运行良好。

这个选项现在已经消失了,我无法找到一个好的选择。在不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?我想出的一切都很笨拙,并引发了我的感觉,即“Ember 有更好的方法”

简而言之,我想要:

  • 触发事件的工具栏按钮
  • 对此做出反应并对其自身部分执行一些更新的主视图。
  • 不会像通过路由那样在 Ember 的意义上重新渲染的主要视图。它使用绘图库并将其所有属性和行为集成到 Ember 模型和控制器中不会很有趣。
  • 工具栏和主视图共享一个父视图,但位于不同的“分支”上。

我正在考虑的不良选择:

工具栏在很大程度上是一个应用程序级别的问题,但它确实有一些需要指示特定视图的按钮。我在 Ember 中看到的一个选项是将工具栏嵌套在“主”视图下。对于它的其他一些功能,这似乎是错误的。

通信可以由一个控制器(甚至可能是一个模型)来处理,该控制器将保存工具栏设置的属性,并且“监听”视图会对其做出反应并重置其值。这听起来像是对控制器和模型目的的滥用,并且像是一个非常糟糕的事件监听器设置。

我可以将绘图库作为 App.Drawing 之类的全局应用程序,但这似乎也很糟糕。这也意味着操作仍然无法使用视图中的任何数据来更新绘图库。

有什么建议么?

4

1 回答 1

2

在不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?

在典型的 ember 应用程序中,这种通信应该发生在控制器之间。否则“糟糕的选项 2”是在正确的轨道上:

通信可以由一个控制器(甚至可能是一个模型)来处理,该控制器将保存工具栏设置的属性,并且“监听”视图会对其做出反应并重置其值。

考虑使用两个控制器。工具栏操作将针对ToolbarController,它负责维护工具栏的状态并更改 main 以响应用户操作。应该通过属性ToolbarController声明依赖。例如:MainControllerneeds

App.ToolbarController = Ember.Controller.extend({
  needs: ['main'],
  buttonOneGotAllPressed: function() {
    main = this.get('controllers.main');
    main.turnOffAnOption();
    main.makeSomeOtherChange();
  }
}); 

现在MainController可以专注于 MainView 的状态。它不应该知道ToolbarController或它的按钮。

这听起来像是对控制器和模型目的的滥用,并且像是一个非常糟糕的事件监听器设置。

同意这可能是对模型目的的滥用,但这正是控制器的用途。

这绝对不是事件侦听器设置,但这似乎不适合您的情况。您描述的工具栏似乎只存在与主视图交互,因此拥有一个依赖于主视图并直接与其交互的工具栏控制器是有意义的。

如果组件真正解耦,那么观察者 (Pub/Sub) 模式可能更合适。如果感兴趣,请参阅如何从另一个框架向 Ember 触发事件。

于 2013-01-30T20:14:55.620 回答