如何从ember eventManager访问父视图和控制器

时间:2013-11-27 22:55:29

标签: ember.js

烬道:

根据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是一个可接受的工作区,那么访问父视图控制器的最佳方法是什么?

2 个答案:

答案 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参数使您可以控制组件/控制器本身。

如果您需要访问组件的父控制器,您可能希望从父控制器绑定到组件上的事件,因为组件实际上不应该知道其范围之外的任何内容。