在 Ember 中,如何在另一个控制器中处理从一个控制器发送的操作

In Ember, how can I handle an action sent from a controller in another controller

我有一个控制器 Athis.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.

拜托,有人可以帮忙吗?谢谢。

一般情况下,如果没有定义,每条路由都会有一个默认控制器。 在controller-A中,如果makeItHappen定义在任何地方,这行代码this.send('makeItHappen');将在数据表、文档、应用程序控制器及其对应路由的操作散列中查找makeItHappen方法那么就不会出现这个错误了。

要实现您的需求, 目前,在您的 route/controller 层次结构中,controller-A 和 controller-B 之间没有 parent-child 关系。所以你可以在 controller-A 中注入 controller-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');
    }
  }
});