Session Ember会话初始值设定项导致每个路由的页面重新加载

Session Ember会话初始值设定项导致每个路由的页面重新加载,session,ember.js,ember-cli,Session,Ember.js,Ember Cli,我正在Ember CLI中构建一个基于Twitter的应用程序,并有一个会话初始值设定项,以确保每个路由上的用户都经过身份验证。用户使用Express.js的passport Twitter模块通过Twitter登录。我以前在一个应用程序中做过这件事,这很好,但在这个应用程序中,我注意到每个路由都会重新加载页面 我已经剥离了所有内容,每个路由只有一个h1标签,它仍然会重新加载页面。然而,只要我移除下面的初始化器和beforeModel钩子,一切都按照预期工作,没有重新加载页面 初始化者/sess

我正在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');
}
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,我甚至不知道如何调试它。非常感谢您的帮助。

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

发件人:

如果从这个钩子返回的值是一个承诺,那么转换将暂停,直到转换解决为止。否则,不以任何方式使用非承诺返回值

beforeModel
第一个钩住入口,一个可以决定是否将用户驶离路线的地方,因此在给定的承诺/过渡得到解决之前,不会有任何结果。如果您的应用程序是以钩子重复运行的方式设置的,则可能会导致“类似刷新”的体验


您可以等待转换完成
转换。然后(…您的设置…
),不返回承诺,或者将
会话.user
值设置为承诺。

有点猜测,因为我看不出“重新加载页面”的确切含义。我将假设这是“无渲染/空白页”阶段

发件人:

如果从这个钩子返回的值是一个承诺,那么转换将暂停,直到转换解决为止。否则,不以任何方式使用非承诺返回值

beforeModel
第一个钩住入口,一个可以决定是否将用户驶离路线的地方,因此在给定的承诺/过渡得到解决之前,不会有任何结果。如果您的应用程序是以钩子重复运行的方式设置的,则可能会导致“类似刷新”的体验


您可以等待转换完成
转换。然后(…您的设置…
),不返回承诺,或者将
session.user
值设置为承诺。

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


(这实际上假设您在某个地方有代码可以在会话未激活时重定向/刷新,但我假设是这样的,因为如果没有,您为什么还要进行会话?

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


(这实际上假设您在某个地方有代码可以在会话未激活时重定向/刷新,但我假设是这样的,因为如果没有,为什么还要进行会话?

重定向前有控制台错误和警告吗?也许可以尝试使用JavaScript调试器,例如在Chrome中?在重定向之前有控制台错误、警告吗?也许可以尝试在Chrome中使用JavaScript调试器?它不会在每次转换时都被调用,它会在应用程序的第一次加载时被调用。这是真的,对我来说有点奇怪和违反直觉。您是否有机会在文档中了解到为什么会发生这种情况?我已经编辑了关于钩子被反复运行的信息,但留下了其他信息,因为根据提供的代码,我相信问题可能是由于某种原因重新运行钩子引起的。当您转到URL时,Ember将激活所有的路由段。由于应用程序是隐式根段,所以当您第一次在应用程序中输入任何路由时,它就会被激活。我想API文档可能会提到这一点。由于这是一个离题的问题,我定义了这个问题,因为它不会在每次转换时被调用,它会在应用程序的第一次加载时被调用。这是真的,对我来说有点奇怪和违反直觉。您是否有机会在文档中了解到为什么会发生这种情况?我已经编辑了关于钩子被反复运行的信息,但留下了其他信息,因为根据提供的代码,我相信问题可能是由于某种原因重新运行钩子引起的。当您转到URL时,Ember将激活所有的路由段。由于应用程序是隐式根段,所以当您第一次在应用程序中输入任何路由时,它就会被激活。我想API文档可能会提到这一点。因为这是一个离题的问题,我将其定义为