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



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

我已经把所有的东西都去掉了,每个路由只有一个h1标签,它仍然会重新加载页面。然而,只要我删除了下面的初始化器和beforeModel钩子,一切都像预期的那样工作,不需要重新加载页面。

初始化/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的最新版本,我不确定如何调试这个。如有任何帮助,不胜感激。

有点猜测,因为我不明白你所说的"重新加载页面"到底是什么意思。我假设这是"无渲染/空白页面"阶段。

来自Ember的beforeModel文档:

如果从该钩子返回的值是promise,则转换将暂停,直到转换解决。否则,将不会以任何方式使用非承诺返回值。

beforeModel第一个钩子在入口,一个地方,在那里可以决定驱动用户离开路线,所以什么都不会渲染,直到给定的承诺/过渡被解决。如果你的应用程序的设置方式是反复运行钩子,可能会导致"类似刷新"的体验。

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

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

(这实际上假设你有代码的地方重定向/刷新,如果会话不活跃,但我假设是这种情况,因为如果不是,为什么你甚至有会话?)

最新更新