我正在从旧版本的EmberJS迁移我的项目。在某些地方,我曾经通过在任何视图的init()方法中使用以下来获取与视图无关的控制器实例:
var controller = App.get('router').get('firstController');
但现在这会引发跟随错误。
Uncaught TypeError: Cannot call method 'get' of undefined
这可能是因为它无法获取Router对象。现在如何获取与视图无关的控制器实例?或如何获得路由器对象
答案 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']
});