Ember 会话初始化程序导致每个路由的页面重新加载

Ember session initializer causing page reload for every route

我正在 Ember-CLI 中构建一个基于 Twitter 的应用程序,并有一个会话初始化程序来确保用户在每个路由上都经过身份验证。用户使用 Express.js 的 passport-twitter 模块通过 Twitter 登录。我以前在以前的应用程序中做过这个并且很好,但在这个应用程序中我注意到每条路线都会重新加载页面。

我已将所有内容剥离到每个路由仅一个 h1 标记,它仍然会重新加载页面。但是,一旦我删除下面的初始化程序和 beforeModel 挂钩,一切都会按预期工作,没有重新加载页面。

initializers/session.js :

name: 'session',
initialize: function(container, app) {
  var Session = Ember.Object.extend({
    user: null,
      isAuthenticated: function() {
      return this.get('user') !=null;
    }.property('user')
  });
  app.register('session:main', Session);
  app.inject('route', 'session', 'session:main');
  app.inject('controller', 'session', 'session:main');
}

routes/application.js

beforeModel: function() {
  var route = this;
  var promise = this.store.find('user', {operation: 'authenticated'});
  return promise.then(function(users) {
    if (users && users.get('length') > 0) {
      var user = users.get('firstObject');
      route.set('session.user', user);
    }
    return users;
  });
},

我试过在 app.register 中设置 {singleton: true} 以防万一,但这也不起作用。

我正在使用 Ember 1.11.1 和 Ember-CLI 0.2.3 的更新版本,我什至不确定如何调试它。非常感谢任何帮助。

有点猜测,因为我看不出你说的 "reloading the page" 到底是什么意思。我假设它是 "nothing rendered/blank page" 阶段。

来自Ember's beforeModel documentation

if the value returned from this hook is a promise, the transition will pause until the transition resolves. Otherwise, non-promise return values are not utilized in any way.

beforeModel第一个 入口处的钩子,一个可以决定让用户离开路线的地方,所以在给定 [=28= 之前什么都不会呈现] 已解决。如果您的应用程序设置为挂钩重复 运行 的方式,则可能会导致 "refreshing-like" 体验。

您可以等待转换完成 transition.then(..your setup...),而不是 return 承诺,或者将 session.user 值设置为承诺。

我认为您使用 { singleton: false } 的方法是正确的,但我相信在 Ember 的最后几个版本中已经发生了变化。根据 the guide,你需要使用 { instantiate: false } 来告诉 Ember 容器你正在给它一个已经实例化的对象。另外,一定要使用 Ember.Object.create() 而不是 Ember.Object.extend()。这将确保您每次都获得相同的会话实例。

(这实际上假设您在某处有代码 redirects/refreshes 如果会话未激活,但我假设是这种情况,因为如果没有,您为什么还要进行会话?)