Ember会话初始化器会导致每个路由的页面重新加载 [英] Ember session initializer causing page reload for every route

查看:121
本文介绍了Ember会话初始化器会导致每个路由的页面重新加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Ember-CLI中构建一个基于Twitter的应用程序,并有一个会话初始化程序,以确保用户在每个路由上进行身份验证。用户通过Twitter登录,使用Express.js的护照 - 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,而我不知道如何调试这个。任何帮助非常感谢。

解决方案

有点猜测,因为我不能看到你的意思是重新加载页面。我要假设它是没有渲染/空白页阶段。



Ember的beforeModel文档


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


beforeModel 第一个入口挂钩,一个地方,可以决定将用户从路由上移开,所以在给定的承诺/转换解决之前,没有任何东西会呈现。如果您的应用程序以某种方式进行安装,则可以重复运行钩子,可能会导致刷新的体验。



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


I'm building a Twitter based app in Ember-CLI and have a session initializer to ensure users are authenticated on each route. Users login via Twitter using the passport-twitter module for Express.js. I've done this before in a previous app and it's fine, but in this app I've noticed that every route reloads the page.

I've stripped everything out to just an h1 tag per route and it still reloads the page. As soon as I remove the initializer and beforeModel hook below however, everything works as expected with no page reload.

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;
  });
},

I've tried setting {singleton: true} in app.register just in case, but that doesn't work either.

I'm using a more recent version of Ember 1.11.1 and Ember-CLI 0.2.3 and I'm not sure how to even debug this. Any help much appreciated.

解决方案

A bit of a guess, since I cannot see what exactly do you mean by "reloading the page". I'm going to assume it's "nothing rendered/blank page" phase.

From 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 is first hook on entry, a place, where one can decide about driving user off the route, so nothing will render until given promise/transition is resolved. If your application is setup in a way hook is run repeatedly it might result in "refreshing-like" experience.

You could either wait for transition to finish transition.then(..your setup...), not return a promise, or set session.user value to a promise.

这篇关于Ember会话初始化器会导致每个路由的页面重新加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆