根据ember的documentation关于views'eventManagers,它们必须在父类定义中created
,如下所示:
AView = Ember.View.extend({
eventManager: Ember.Object.create({
将它们与父视图(AView)
封装并隔离。
访问事件上下文的唯一方法是通过view
参数和每个event
传递
dragEnter: function(event, view) {
我在大型视图中的各种拖动事件中做了很多工作,包括许多子视图,输入,复选框等。 在这个表单之后,我的代码开始竭尽全力确定每个事件来自哪个子视图,然后采用不同的路径来访问公共父控制器:
drop: function(event, view) {
var myController;
if(view.$().hasClass('is-selected') ||
view.$().hasClass('list-map-container')) {
myController = view.get('controller.controllers.myController');
} else if(view.$().hasClass('ember-text-field')) {
myController = view.get('parentView.parentView.controller');
} else {
myController = view.get('controller');
}
// do work with myController
}
为了简化我在父视图中使用didInsertElement
挂钩将所需的控制器指定为eventManager上的属性:
App.MyView = Ember.View.extend({
didInsertElement: function() {
this.set('eventManager.controller', this.get('controller'));
},
eventManager: Ember.Object.create({
controller: null,
// ...
这可以显着简化我的事件处理程序:
drop: function(event, view) {
var myController = this.get('controller');
// do work with myController
我的直觉告诉我,这种黑客行为不是最好的解决方案。
也许我不应该在eventManager中完成所有工作?而是将所有这些工作移到控制器上,然后从视图中转发事件?
但是如果eventManager是一个可接受的工作区,那么访问父视图控制器的最佳方法是什么?
答案 0 :(得分:3)
我知道这是一个迟到的答案,但这个问题似乎是谷歌的结果。这是我在搜索emberjs示例时如何做到这一点。
要访问eventManager
中的视图,您必须在事件函数处理程序中指定两个参数:
eventManager: Ember.Object.create({
keyUp: function(event, view){
view = view.get('parentView'); // The view parameter might not be the current view but the emberjs internal input view.
view.get('controller'); // <-- controller
}
}),
答案 1 :(得分:0)
如果我错了,请纠正我,但看起来所有控制器逻辑都封装到文本字段中 - 如果是这样,我认为某个组件可能更适合这个用例。它本质上是一个控制器和视图,以及eventManager的回调&#39; view参数使您可以控制组件/控制器本身。
如果您需要访问组件的父控制器,您可能希望从父控制器绑定到组件上的事件,因为组件实际上不应该知道其范围之外的任何内容。