所以我使用基于纯令牌的方法成功实现了Ember-Auth。我想在用户登录后将其用户重定向到我的应用的根目录。
我知道我可以在文档中使用actionRedirectable
(http://ember-auth.herokuapp.com/docs),但由于我使用的是纯粹的令牌方法,而且没有在Cookie中存储任何内容,因此我每次都会在页面中再次对用户进行签名使用remember_token
刷新(这似乎是不理想的,但我很快就会解决)。这意味着使用actionRedireactable
意味着每次用户刷新页面时我都会重定向。也许某处有反模式?
无论如何,这是我的SignInView
:
App.SignInView = Ember.View.extend({
templateName: 'auth/sign_in',
email: null,
password: null,
submit: function(event, view) {
event.preventDefault();
event.stopPropagation();
App.Auth.signIn({
data: {
email: this.get('email'),
password: this.get('password')
}
});
}
});
如果我在signIn调用之后直接调用this.get("controller").transitionToRoute('...')
,那么此时我的用户总是没有登录,因此他们会再次重定向到登录页面。如果我尝试:
App.Auth.on('signInSuccess', function() {
// ...
});
然后我没有任何明智的方法来访问路由器进行转换。任何好主意都会受到高度赞赏。谢谢!
答案 0 :(得分:2)
作为最佳实践,您不应该在视图中使用逻辑,逻辑更适合居住在控制器中,因此对于您的用例,请在您的身份验证过程中创建App.SignInController
工具:
App.SignInView = Ember.View.extend({
templateName: 'auth/sign_in',
email: null,
password: null,
submit: function(event, view) {
event.preventDefault();
event.stopPropagation();
var data = {
email: this.get('email'),
password: this.get('password')
}
// forward the action to your controller passing along the
// data object your sign in process needs
this.get("controller").send("signIn", data);
}
});
此外,您不应该从路由器内部以外的其他地方转换。通过这样做,您可能会遇到严重的问题,因为您不知道您的路由器实际上是state
。所以最好的办法是获取对路由器的引用,然后在路由器上调用transitionTo
:
App.SignInController = Ember.ObjectController.extend({
signIn: function(data) {
// grab your passed data object and issues you sign in
App.Auth.signIn({
data: data
});
// subscribe to the `signInSuccess` event and
// then transition to your route but using
// the router itself
App.Auth.one('signInSuccess', function() {
var router = this.get('target.router');
router.transitionTo('route_name');
});
}
});
希望这有帮助。
答案 1 :(得分:0)
我没有经过测试,但我认为这有效:
App.SignInView = Ember.View.extend({
templateName: 'auth/sign_in',
email: null,
password: null,
submit: function(event, view) {
event.preventDefault();
event.stopPropagation();
var controller = this.get('controller');
App.Auth.signIn({
data: {
email: this.get('email'),
password: this.get('password')
}
});
App.Auth.one('signInSuccess', function() {
controller.transitionToRoute('...');
});
}
});