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