如何在没有controller.get('view')的情况下制作动作会影响同级视图?

时间:2013-01-30 19:07:11

标签: ember.js ember-router

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

app -- main
   \-- toolbar

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

在1.0 pre2和更早版本中,我使用了actions和router.get('someController.view')来访问我想要的视图并触发action / method / event。几乎没有应用程序设计的巅峰,但它运行良好。

这个选项现在已经消失了,我对替代方案感到茫然。 在不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?我提出的所有内容都很笨拙,并触发我的感觉“Ember有更好的方式”< / em>的

简而言之,我想:

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

我正在考虑的不良选择:

工具栏非常关注应用程序,但它确实有一些需要指示特定视图的按钮。我在Ember中看到的一个选项是将工具栏嵌套在“主”视图下。对于其他一些功能来说,这似乎是错误的。

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

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

在典型的ember应用程序中,此通信应在控制器之间进行。否则“劣势选项2”就在正确的轨道上:

  

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

考虑使用两个控制器。工具栏操作将以ToolbarController为目标,ToolbarController负责维护工具栏的状态以及更改main以响应用户操作。 MainController应通过needs属性声明对App.ToolbarController = Ember.Controller.extend({ needs: ['main'], buttonOneGotAllPressed: function() { main = this.get('controllers.main'); main.turnOffAnOption(); main.makeSomeOtherChange(); } }); 的依赖关系。例如:

MainController

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

  

这听起来像滥用控制器和模型目的,就像一个非常差的事件监听器设置。

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

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

如果组件真正解耦,那么观察者(Pub / Sub)模式可能更合适。如果感兴趣,请参阅How to fire an event to Ember from another framework