Ember从路线访问不同的控制器

时间:2015-05-27 10:09:29

标签: ember.js

我想从afterModel内的其他路径(问题)访问applicationController。

主要目标是在解析承诺模型后更改应用程序的背景。

这是我的issue.js

import Ember from 'ember';

export default Ember.Route.extend({

  needs: ['application'],
  model: function(params) {
    [... some code ...]
  },
  afterModel: function(model, transition) {
    model.issue.then(function(resolvedIssue) {

      // I'm looking to access the controller here
      var theOtherController = this.get('controllers.application');

      return resolvedIssue;
    });

  }

});

我尝试了几种组合,没有成功。 当我尝试在控制台中记录内容时,我收到一条try / catch错误消息。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的代码中有几处错误。首先,issue中没有model.issue.then(...)路由的范围,因此get('controller')无效。其次,needs语句仅对控制器有效,而不对路由有效。

您应该在issue路线中发送操作,并使用ember冒泡操作在application路线中捕捉它。

发送的所有操作都会通过最多application路由的路由冒泡。如果application路由未处理此操作,则会引发错误。看一下应该在issue路线中的代码:

afterModel: function(model, transition) {
  var _this = this;
  model.issue.then(function(issue) {
    _this.send('changeLayout', issue.get('image'));
  });
}

在您的申请路线中,您可以抓住该行动,例如在应用程序控制器上执行一些方法:

toggleLayout: function(desiredImage) {
   // time to actually change the image here
   console.log("let's display " + desiredImage);
}

application路线:

actions: {
  changeLayout: function(desiredImage) {
    this.get("controller").toggleLayout(desiredImage);
    return false; // make sure to stop bubbling up!
  }
}

它比使用任何类型的needs更好,因为它完全涵盖了数据向下操作的惯例。