如果我进行手动页面刷新或设置这样的重定向
}).then(function() {
document.location = "/";
}, function() {
在我的Ember应用程序的一个函数中,Ember控制器属性正在变得未设置。我不确定哪个属性正在变得不重要,但如果确实如此,这就是代码。在我的应用程序模板中,我检查用户是否经过身份验证
{{#if isAuthenticated}}
blah blah
{{else}}
blah blah
{{/if}}
该属性在AuthController中设置
App.AuthController = Ember.ObjectController.extend({
currentUser: null,
isAuthenticated: Em.computed.notEmpty("currentUser.email"),
login: function(route) {
var me;
me = this;
return $.ajax({
url: "/users/sign_in.json",
type: "POST",
data: {
"user[email]": route.currentModel.email,
"user[password]": route.currentModel.password
},
success: function(data) {
me.set('currentUser', data.user);
因此,在我刷新页面后,我的currentUser(根据Ember)不再显示为已验证。但是,在(Ruby on Rails)服务器端,用户仍然经过身份验证。我把这些代码放在布局中进行检查,在Ember认为我已退出(刷新页面)后,我的服务器代码仍然告诉我我已登录(事实上我已经登录)。
<% if current_user %>
there is a current user
<% end %>
你能解释为什么会这样吗?
答案 0 :(得分:2)
如果isAuthenticated
为空,那么设置最好是将/users/current
作为一个计算属性,使ajax GET 到currentUser
。如果用户未经过身份验证,则/users/current
应返回{}
,如果用户身份,则返回当前用户数据。
App.AuthController = Ember.ObjectController.extend({
currentUser: null,
isAuthenticated: function() {
var currentUser = this.get('currentUser');
if(Ember.isEmpty(currentUser)) {
$.ajax({
type: "GET",
url: "/users/current.json",
async: true
}).done( function( data ) {
me.set('currentUser', data.user);
});
return false;
} else {
return true;
}
}.property('currentUser'),
});
答案 1 :(得分:1)
为什么要进行手动页面刷新?这样您就可以从头开始完全启动浏览器,因此Ember App会再次初始化,因此未在Controller上设置属性currentUser。
而不是这样做:
}).then(function() {
document.location = "/";
}, function() {
我假设您要转到应用的开始页面(因为您想要转到“/”)。 相反,您应该使用路由之间转换的Ember功能。我不知道,您执行上述代码的位置,但您可以通过其中一个控制器或路径执行此操作。
在控制器中,您可以使用transitionToRoute:
// index is a Route which is implicitly generated by Ember for you
this.transitionToRoute('index');
在路由器中,您可以使用transitionTo:
this.transitionTo('index');