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

时间:2017-01-16 14:58:22

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

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

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

1 个答案:

答案 0 :(得分:2)

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

实现您的需求, 目前,在您的路由/控制器层次结构中,控制器-A和控制器-B之间没有父子关系。所以你可以将控制器-B注入控制器-A并直接调用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');
    }
  }
});