【问题标题】:How to access parent view and controller from ember eventManager如何从 ember eventManager 访问父视图和控制器
【发布时间】:2024-01-15 21:18:01
【问题描述】:

余烬之道:

根据 ember 的 documentation 关于视图的事件管理器,它们在父类定义中必须是 created,如下所示:

AView = Ember.View.extend({
  eventManager: Ember.Object.create({ 

封装它们并将它们与其父视图(AView)隔离开来。

访问事件上下文的唯一方法是通过与每个event 一起传入的view 参数

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

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    我知道这是一个迟到的答案,但这个 SO 问题是谷歌的结果。以下是我在搜索 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
      }
    }),
    

    【讨论】:

      【解决方案2】:

      如果我错了,请纠正我,但看起来所有控制器逻辑都封装到了一个文本字段中——如果是这样,我认为一个组件可能更适合这个用例。它本质上是一个控制器和一个视图,并且 eventManager 的回调的视图参数使您可以控制组件/控制器本身。

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

      【讨论】: