【问题标题】:In Ember, how can I handle an action sent from a controller in another controller在 Ember 中,如何处理从另一个控制器中的控制器发送的动作
【发布时间】:2017-01-16 14:58:22
【问题描述】:

我有一个控制器A,它使用this.send('makeItHappen') 发送了一个动作,我想在控制器B 中处理它。我该怎么做?

JS:

// controllers/documents/datasets/controller-A
import Ember from 'ember';

export default Ember.Controller.extend({
  actions: {
    sendToDataCenter() {
      this.send('makeItHappen'); // this throws an error
    }
  }
});


// controllers/controller-B
import Ember from 'ember';

export default Ember.Controller.extend({
  actions: {
    makeItHappen() {
      console.log('It works!!');
    }
  }
});

在控制器 B 中,它会抛出一个错误: Uncaught Error: Nothing handled the action 'makeItHappen'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

请问,有人可以帮忙吗?谢谢。

【问题讨论】:

  • 控制器 A 和控制器 B 之间的连接是什么?我的意思是它分别是父子路由吗?如果没有连接,则可以注入控制器并直接调用函数
  • 谢谢@kumkanillam,路径是:controllers/documents/datasets/controller-Acontrollers/controller-B
  • 我没有找到 A 和 B 控制器之间的任何关系,我的意思是当存在父子关系时,send 将冒泡到父控制器,直到父应用程序路由在层次结构中......所以你可以注入并直接调用控制器-B 的makeItHappen 函数。这是可能的

标签: javascript ember.js web-applications ember-controllers


【解决方案1】:

一般来说,如果没有定义,每条路由都会有一个默认控制器。 在控制器-A 中,这行代码this.send('makeItHappen'); 将在数据表、文档、应用程序控制器及其相应路由的操作哈希中查找makeItHappen 方法,如果在任何地方定义了makeItHappen,则不会出现此错误。

为了实现您的需要, 目前,在您的路由/控制器层次结构中,控制器 A 和控制器 B 之间没有父子关系。所以你可以在控制器A中注入控制器B并直接调用makeItHappen

// controllers/documents/datasets/controller-A
import Ember from 'ember';

export default Ember.Controller.extend({
controllerB:Ember.inject.controller('controller-B');//this should be already instantiated ie,this corresponding route should be visited earlier otherwise you will get `unknown injection: controller:users' Error
  actions: {
    sendToDataCenter() {
      this.get('controllerB').send('makeItHappen');
    }
  }
});

【讨论】:

  • 感谢您的回答。但我想使用 Controller-A 在 Controller-B 中发送的内容。我必须使用与将 Controller-A 注入 Controller-B 相同的技术吗?
  • 这种要求很奇怪,如果你只想单独使用函数,那么你可以将它写成一个 util 文件并导出并包含在你需要的任何地方。
  • 基本上我想要的只是从选择下拉列表的 onchange 事件中发送一个动作及其值(在 Controller-A 中)。然后在另一个控制器(Controller-B)中捕获它,仅此而已。但我不知道我该怎么做。
  • send 将在控制器/路由层次结构中冒泡,即,您只能在以下控制器文件(应用程序、文档、数据表)或路由文件(应用程序、文档、数据表)中捕获它。但不在其他控制器中。如果你故意要调用其他一些控制器文件方法,那么你需要注入特定的控制器并调用所需的函数。
  • 酷!我现在明白了。不过感谢您的帮助和教导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2013-07-20
  • 1970-01-01
  • 2011-09-30
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多