快速背景: 应用程序视图有2个出口。一个用于工具栏。另一个是可路由的“主”视图层次结构。
app -- main
\-- toolbar
我需要工具栏中的一些按钮来触发“主”视图中的事件。不更新任何模型中的任何数据。我只是指示它触发视图所呈现的绘图库的一些更改。清除画布,重置缩放值等。
在1.0 pre2和更早版本中,我使用了actions和router.get('someController.view')来访问我想要的视图并触发action / method / event。几乎没有应用程序设计的巅峰,但它运行良好。
这个选项现在已经消失了,我对好替代方案感到茫然。 在不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?我提出的所有内容都很笨拙,并触发我的感觉“Ember有更好的方式”< / em>的
简而言之,我想:
我正在考虑的不良选择:
工具栏非常关注应用程序,但它确实有一些需要指示特定视图的按钮。我在Ember中看到的一个选项是将工具栏嵌套在“主”视图下。对于其他一些功能来说,这似乎是错误的。
通信可以由控制器(甚至可能是模型)处理,该控制器将保存工具栏设置的属性和“监听”视图对其值的反应和重置。这听起来像滥用控制器和模型的目的,就像一个非常差的事件监听器设置。
我可以将绘图库作为App.Drawing的全局应用程序,但这看起来也很糟糕。这也意味着操作仍然无法利用视图中的任何数据来更新绘图库。
有什么建议吗?
答案 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。