Mar*_*tin 6 ember.js ember-router
快速上下文:应用程序视图有2个出口.一个用于工具栏.另一个用于可路由的"主"视图层次结构.
app -- main
\-- toolbar
Run Code Online (Sandbox Code Playgroud)
我需要工具栏中的一些按钮来触发"主"视图中的事件.不更新任何模型中的任何数据.我只是指示它触发视图所呈现的绘图库的一些更改.清除画布,重置缩放值等.
在1.0 pre2和更早版本中,我使用了actions和router.get('someController.view')来访问我想要的视图并触发action/method/event.几乎没有应用程序设计的巅峰,但它工作得很好.
这个选项现在已经消失,我不知道是一个不错的选择.在不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?我所提出的一切都是笨重的,并引发了我对"Ember有更好的方法"的感觉.
总之我想:
糟糕的选择我正在考虑:
工具栏非常关注应用程序,但它确实有一些需要指示特定视图的按钮.我在Ember中看到的一个选项是将工具栏嵌套在"主"视图下.对于其他一些功能来说,这似乎是错误的.
通信可以由控制器(甚至可能是模型)处理,该控制器将保持工具栏设置的属性和"监听"视图对其值的反应和重置.这听起来像滥用控制器和模型的目的,就像一个非常差的事件监听器设置.
我可以使绘图库成为App.Drawing或其他东西的全局应用程序,但这似乎也很糟糕.这也意味着操作仍然无法利用视图中的任何数据来更新绘图库.
有什么建议?
当不在子/父层次结构中的视图之间进行通信时,我应该使用什么机制?
在典型的 ember 应用程序中,这种通信应该发生在控制器之间。否则“糟糕的选项 2”就在正确的轨道上:
通信可以由控制器(甚至可能是模型)处理,该控制器将保存工具栏设置的属性,“监听”视图对其做出反应并重置其值。
考虑使用两个控制器。工具栏操作将针对ToolbarController,它负责维护工具栏的状态并更改 main 以响应用户操作。应该声明对via属性的ToolbarController依赖。例如:MainControllerneeds
App.ToolbarController = Ember.Controller.extend({
needs: ['main'],
buttonOneGotAllPressed: function() {
main = this.get('controllers.main');
main.turnOffAnOption();
main.makeSomeOtherChange();
}
});
Run Code Online (Sandbox Code Playgroud)
现在MainController可以关注 MainView 的状态。它不应该意识到ToolbarController它的按钮。
这听起来像是滥用控制器和模型目的,并且像是一个非常糟糕的事件侦听器设置。
同意这可能是对模型目的的滥用,但这正是控制器的用途。
这绝对不是事件侦听器设置,但这似乎不太适合您的情况。您描述的工具栏似乎只是为了与主视图交互而存在,因此拥有一个依赖于 main 并直接与其交互的工具栏控制器是有意义的。
如果组件真正解耦,那么观察者 (Pub/Sub) 模式可能更合适。如果您感兴趣,请参阅如何从另一个框架向 Ember 触发事件。
| 归档时间: |
|
| 查看次数: |
1220 次 |
| 最近记录: |