2

所以我已经使用纯基于令牌的方法成功实现了 Ember-Auth。我想在我的用户登录后将他们重定向到我的应用程序的根目录。

我知道我可以使用actionRedirectable(文档中的http://ember-auth.herokuapp.com/docs),但是由于我使用的是纯令牌方法并且没有在 cookie 中存储任何内容,因此我每次页面都有效地再次登录我的用户使用 a 刷新remember_token(这似乎不理想,但我很快就会解决)。这意味着 usingactionRedireactable意味着每次用户刷新页面时我都会重定向。也许某处存在反模式?

无论如何,这是我的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')
      }
    });
  }
});

如果我this.get("controller").transitionToRoute('...')在 signIn 调用之后直接调用,那么此时我的用户总是没有登录,因此他们会再次被重定向到登录页面。如果我尝试:

App.Auth.on('signInSuccess', function() {
  // ...
});

那么我没有任何明智的方式来访问路由器进行转换。任何聪明的想法将不胜感激。谢谢!

4

2 回答 2

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

  }
});

希望这可以帮助。

于 2013-08-16T15:44:10.513 回答
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('...');
    });

  }
});
于 2013-08-16T14:22:48.680 回答