【问题标题】:Ember.js: what is the preferred way for multiple objects to respond to events?Ember.js:多个对象响应事件的首选方式是什么?
【发布时间】:2013-11-25 19:05:01
【问题描述】:

我有一个嵌套三层深度的对象(选项)(项目->选项->选项)。当一个选项被选中时,所有三个对象都将改变它们的显示(选项将被突出显示,其他选项将被淡化,并且项目将被重新排列)。

处理这一系列动作的首选方式是什么?

  • Ember.js - Propagate event up the controller/router chain - 在此示例中,每个对象都会响应操作,然后告诉操作继续传播。有道理,但我的印象是,这可能是一个非正统的方法来解决必须是一个常见问题。这是一个不错的选择吗?

【问题讨论】:

  • 链接的示例 (jsbin.com/OvafUxUf/2/edit) 看起来很合理,除了收件人是明确选择的 - 它不一定沿着自然层次结构传播。

标签: ember.js action event-bubbling


【解决方案1】:

您有三个选择:

1。向上传播控制器层次结构。

当对象实际上位于模型端的层次结构或树中时,这是最简单和最好的选择,因为每个对象的控制器都有对父对象控制器的显式引用。

2。向上传播路由层次结构

当视图层次结构不一定对应于模型中的树结构,而是语义时,这是最佳选择。如果您认为相关对象的语义排列在未来容易发生变化,这是一个更好的选择。但是,您仍然假设存在层次结构

3。让第一个处理程序成为“知道”对象如何相关的最顶层路由,

并且该处理程序将事件发送到必要的控制器。 当特定视图集中的对象之间的关系是语义的并且不一定是分层的并且您认为路由/视图可能在应用程序的开发过程中移动时,此选项是最佳选择。这种情况的最好例子是“负面”事件——例如,deselect

您可以随时混合使用这些策略。我发现如果事件倾向于上升到路由并返回到必要的控制器而不是在我的控制器中有很多 needs,那么重构会更容易。

【讨论】:

  • 太好了,谢谢迈克尔。澄清一下,事件是否总是使用send('eventNamne') 传播,就像上面直观像素的示例一样?我有点期待 Ember 有一个 continueActionPropagation() 函数或者可以沿着默认路径继续操作的东西。
  • 您的建议“如果事件倾向于上升到路由并返回到必要的控制器,那么重构会更容易”很有意义。您能否发布一些示例代码来说明这种方法以及如何识别“知道”关系的路线?
  • 您可以明确地sendreturn true 继续传播到同名操作。实际上,如果您不返回任何内容,动作将会传播——停止传播你 return false 或使用标准 jquery event.stopPropagation()
  • 我手头没有示例代码,但我的合同即将到期,所以我可能会抽空写一篇关于这个想法的博文。
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2012-11-27
  • 1970-01-01
  • 2014-12-22
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多