这可能是一个愚蠢的问题,但我无法在任何地方找到任何相关信息......
我在我的一个控制器中创建了一个方法,以验证用户会话是否仍然良好,并且我在我的beforeModel中的应用程序的几乎每个页面中都使用此方法。但问题是我不想每次都在每条路线上复制/粘贴代码,这会很脏,我真的不喜欢它。
假设我有这个控制器:
App.LoginController = Ember.ObjectController.extend({
...
isSession: function() {
var session = this;
Ember.$
.get(host + '/session', function(data) {
console.log('DEBUG: Session OK');
})
.fail(function() {
console.log('DEBUG: Session FAIL');
session.transitionToRoute('login');
});
}
});
如何在此路由器中调用它:
App.HomeRoute = Ember.Route.extend({
beforeModel: function(transition) {
//Here
},
model: function() {
return this.store.all('login');
}
});
我已尝试过此this.get('loginController').isSession();
,但收到此错误Error while loading route: TypeError: Cannot call method 'isSession' of undefined
感谢您的帮助!
[编辑]
我没有太多要展示但是:
我的地图
App.Router.map(function() {
this.route('login', { path: '/' });
this.route('home');
this.resource('enquiries', function() {
this.route('enquiry', { path: '/:enquiry_id' }, function() {
this.route('update');
});
});
});
我很可能只有一个LoginController和我的HomeRoute。 (它的应用程序的开头) 我不需要为我的登录创建路由,因为我的登录模板中有一个动作助手,之后我被重定向到我的主页模板。
答案 0 :(得分:2)
您需要使用controllerFor()
方法才能从路由器调用控制器上的方法。如果方法是一项操作,则需要使用send()
方法,例如this.controllerFor('login').send('isSession')
App.HomeRoute = Ember.Route.extend({
actions: {
willTransition: function(transition) {
transition.abort();
this.controllerFor('login').isSession()
}
});
答案 1 :(得分:1)
如果您不需要isSession
的返回值,则可以考虑在顶级路线上将其设为action
。 The router.send method in the docs有一个非常好的例子,说明你如何宣布行动以及你如何称呼它们。请注意,send
也是您可以在控制器上调用的方法。操作从控制器冒泡到父路由,然后一直向上路由层次结构,如here所示