2

我正在从旧版本的 EmberJS 迁移我的项目。在某些地方,我曾经通过在任何视图的 init() 方法中使用以下内容来获取与视图无关的控制器实例:

var controller = App.get('router').get('firstController');

但是现在这会引发以下错误。

  Uncaught TypeError: Cannot call method 'get' of undefined 

这可能是因为它无法获取 Router 对象。现在如何获取与视图无关的控制器实例?或如何获取路由器对象

4

1 回答 1

3

“需要”功能允许控制器访问其他控制器,这允许控制器的视图访问其他控制器。(Ember 中需求的一个很好的解释:http: //darthdeus.github.com/blog/2013/01/27/controllers-needs-explained/

1.0.0rc 中 View 的 init 函数中无法访问 Controller 中所述,视图controller属性在调用时尚未设置init(),因此您需要controller在视图生命周期的稍后时间访问。例如,这可能是willInsertElement()ordidInsertElement()钩子。

这是一个示例,演示使用需要从视图访问另一个控制器:

http://jsbin.com/ixupad/186/edit

App = Ember.Application.create({});

App.ApplicationController = Ember.Controller.extend({
  doSomething: function(message) {
    console.log(message);
  }
});

App.IndexView = Ember.View.extend({
  templateName: 'index',
  init: function() {
    this._super();
    // doesn't work, controller is not set for this view yet see:
    // https://stackoverflow.com/questions/15272318/cannot-access-controller-in-init-function-of-view-in-1-0-0rc
    //this.get('controller.controllers.application').doSomething("from view init");
  },
  willInsertElement: function() {
    this.get('controller.controllers.application').doSomething("from view willInsertElement");
  },
  clickMe: function() {
    this.get('controller.controllers.application').doSomething("from clickMe"); 
  }
});

App.IndexController = Ember.Controller.extend({
  needs: ['application']
});
于 2013-03-11T13:21:37.127 回答