场景:一个具有自己的控制器和视图的自动完成小部件,因此它是一个模块化组件,可以在移出后使用 {{render "autocomplete"}} 或新的 {{control}} 助手渲染到任何其他视图中的实验阶段。为了使自动完成独立于其他一切,它不应该知道父控制器或选择项目时发生的操作。
我一直在试图弄清楚如何使用 Ember.Evented mixin,以便我可以从自动完成中触发一个事件,例如 itemSelected,然后它可以冒泡并被父视图或控制器捕获。
因此,与往常一样,缺少 Ember 文档。特别是在涉及 Ember.Evented 时。(公平地说,文档已经走了很长一段路,但我仍然想要更多。他们说约定优于配置而不提供约定!)无论如何,抱怨足够多,文档显示 ember 事件处理通用对象,我发现这篇文章进入更深入一点:EmberJs 是否支持发布/订阅者事件模式?但我认为一个更真实的例子,包括控制器、视图、路由和自动完成等组件会很棒。
我认为这些类型的事件应该是视图的责任,但这不起作用,所以我也将 mixin 放在控制器上。当您看到 jsFiddle 时,这将是有意义的
在其中你会看到一个假的自动完成控制器,它只是从一个固定装置中获取一组静态内容,并为每个项目显示两个按钮,你可以单击它们来触发来自视图或控制器的事件。在一个真实的例子中,文本框中的输入会被观察到,内容会被更新以根据输入呈现不同的建议,但这对于这个例子并不重要。
jsFiddle: http: //jsfiddle.net/wCfb9/
我最怀疑这些行:this.on("myEvent", this.addItem);
因为触发事件的函数显然被调用了,但就好像事件没有传播或者索引控制器和视图没有实际设置正确以响应事件。
以下是主要问题:
我需要更改什么以便索引控制器可以响应自动完成触发的事件?
实现这一目标的最适合 MVC 的方法是什么?触发/接收是否应该在视图/控制器上?
有一个更好的方法吗?
旁注:我目前的解决方案是needs: ["index"]
在自动完成控制器中添加一个,而不是触发事件,我只是从自动完成控制器显式调用索引控制器中的方法。这有很多问题,首先它是控制器之间的紧密耦合,并且如果假设自动完成会影响多个控制器或在其他地方重新使用并且必须重新配置等,则无法很好地扩展。
希望我解释得足够清楚。感谢所有帮助。