0

我一直在谷歌上搜索这个很多,但一直没能找到你可以说的令人满意的答案或解决方案。

我有这个 Ember 应用程序,http://jsbin.com/aHiVIwU/28#

我的用例非常简单。我只想在用户通过身份验证后向用户显示整个应用程序。如您所见,我没有使用 Ember Data,因此身份验证也将通过 $.ajax

如果我没记错的话,我会有一个这样的登录页面模板,

 <script type="text/x-handlebars" id="login">
            <h1>Login</h1>
           {{view Ember.TextField valueBinding="username"}}
           {{view Ember.TextField type="password" valueBinding="password"}}
           <button {{action 'login' class="btn"}}>Login</button>
 </script>

然后我会映射资源,

App.Router.map(function() {
    this.resource( 'login'); 
});

然后会有一个相应的控制器对吗?

App.LoginController = Ember.ObjectController.extend({
});

但是我遇到的问题是,如何在用户通过身份验证后先显示登录模板,然后再显示整个应用程序?我将不胜感激对此的一些解释和帮助。

4

2 回答 2

2

我不能说这比 Alex 在他的 pull request 中谈论它与 ember 中的路由器改款更好。向下看大约四分之一,“我如何重定向到登录表单以获取经过身份验证的路由并稍后重试原始转换?':

https://gist.github.com/machty/5647589

基本上在用户需要验证的资源的根路由中,您将保存当前转换,转换到登录路由,然后在他们通过身份验证后,重新启动上一个转换。

他提供了一个非常简单的示例,他创建了一个 mixin,可以附加到所有需要身份验证的路由,并且您不必复制代码等。

http://jsbin.com/axarop/54/edit

App.NeedsAuthMixin = Ember.Mixin.create({
  beforeModel: function(transition) {
    // We're using beforeModel here to
    // make sure the user is authenticated.
    var loginController = this.controllerFor('login');
    if (!loginController.get('hasLoggedIn')) {
      alert('you must log in!');
      loginController.set('afterLoginTransition', transition);
      this.transitionTo('login');
    }
  }
});

App.ArticlesRoute = Ember.Route.extend(App.NeedsAuthMixin);

App.LoginRoute = Ember.Route.extend({
  events: {
    login: function () {
      this.controller.set('hasLoggedIn', true);
      var savedTransition = this.controller.get('afterLoginTransition');
      if (savedTransition) {
        this.controller.set('afterLoginTransition', null);
        savedTransition.retry();
      }
    }
  }
});
于 2013-10-27T06:39:31.443 回答
0

Take a look at the Client-side Authentication screen casts on http://www.embercasts.com/. They are from the same guy that made the examples that kingpin2k referenced, but provides a full, working solution.

于 2013-10-28T12:56:25.920 回答