我在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,我不知道如何调试它。任何帮助非常感谢。
答案 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()
。这将确保您每次都获得相同的会话实例。
(这实际上假设你的代码在某个地方重定向/刷新,如果会话不活动,但我假设是这样的,因为如果没有,为什么你甚至会有会话?)