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

时间:2015-08-31 13:33:32

标签: session ember.js ember-cli

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

我已经将所有内容剥离到每个路径只有一个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');
}

路由/ 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,我不知道如何调试它。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:0)

有点猜测,因为我无法通过“重新加载页面”看到你究竟是什么意思。我将假设它是“无任何渲染/空白页面”阶段。

来自Ember's beforeModel documentation

  

如果从此挂钩返回的值是promise,则转换将暂停,直到转换结束。否则,不以任何方式使用非承诺返回值。

beforeModel第一个挂钩进入,一个地方,人们可以决定将用户驱逐出路线,因此在解决给定的承诺/过渡之前不会呈现任何内容。如果您的应用程序设置方式反复运行挂钩,则可能会产生“类似刷新”的体验。

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

答案 1 :(得分:0)

我认为你与{ singleton: false }走在正确的道路上,但我相信在最后几个版本的Ember中已经发生了变化。根据{{​​3}},您需要使用{ instantiate: false }告诉Ember容器您正在为它提供一个已经实例化的对象。另外,请务必使用Ember.Object.create()代替Ember.Object.extend()。这将确保您每次都获得相同的会话实例。

(这实际上假设你的代码在某个地方重定向/刷新,如果会话不活动,但我假设是这样的,因为如果没有,为什么你甚至会有会话?)