如何从视图的init()方法获取任何控制器实例?

时间:2013-03-11 11:08:53

标签: ember.js

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

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

但现在这会引发跟随错误。

  Uncaught TypeError: Cannot call method 'get' of undefined 

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

1 个答案:

答案 0 :(得分:3)

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

正如Cannot access Controller in init function of View in 1.0.0rc中所述,调用controller时尚未设置视图的init()属性,因此您需要稍后访问controller在视图的生命周期中。例如,这可能是willInsertElement()didInsertElement()个钩子。

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

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']
});