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 如果会话未激活,但我假设是这种情况,因为如果没有,您为什么还要进行会话?)
我正在 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 如果会话未激活,但我假设是这种情况,因为如果没有,您为什么还要进行会话?)