我厌倦了试图让我的代码工作,所以从头开始,一点一点地构建。我想我已经发现了我的问题的核心,那就是名称冲突。公平地说,我仍然对此感到很困惑......
这是注册和注入过程:
Ember.Application.create({
ready: function() {
console.log('App ready');
this.register('session:current', App.Session, {singleton: true});
this.inject('session:current','store','store:main');
this.inject('controller','session','session:current');
}
});
这就像一个魅力。首先将 Session 注册为单例,然后确保存储可用于会话对象,最后将会话属性插入每个控制器。
从那里会话对象本身:
App.Session = Ember.Object.extend({
init: function() {
this._super();
console.log("Session started");
this.set('accessToken', $.cookie('access_token'));
this.set('currentUserID', $.cookie('userId'));
},
isLoggedIn: function() {
return ( this.get('accessToken') && !Ember.isEmpty(this.get('currentUserID')) ) ? true : false;
}.property('currentUserID','accessToken'),
isLoggedOut: function() {
return ! this.get('isLoggedIn');
}.property('isLoggedIn'),
userIdObserver: function() {
console.log('Observing userId');
$.cookie('currentUserID',this.get('currentUserID'));
}.observes('currentUserID'),
currentUser: function() {
var self = this;
console.log("current user: " + this.get('currentUserID'));
if (this.get('isLoggedIn')) {
return this.get('store')
.find('user', this.get('currentUserID'))
.then(function(profile){
self.set('currentUser', profile);
},
function(error) {
if (error.status === 401 || error.status === 400) {
// the access token appears to have expired
this.set('currentUserID', null);
this.set('accessToken', null);
self.transitionToRoute('login');
} else {
// console.log("error getting user profile: " + error.status + ". " + error.responseJSON.error.message);
console.log("error gettting user profile [" + this.get('userId') + "]");
}
});
} else {
return null;
}
}.property('currentUserID')
});
这很有效——暂时假设为currentUserID
andaccessToken
设置了一个 cookie。伟大的。显然 Session 中还有一些代码要构建,但为什么我还是觉得有点不舒服?两个原因:
名称冲突。我最初只是打电话currentUserID
,userId
但只是做一个简单的名字交换会使这个解决方案陷入混乱。那么混乱可能有点极端,但它肯定会开始行为不端。我偶然遇到了这个。
内容数组。我仍然不能像currentUserID
我通常想做的那样初始化任何属性。当我这样做时,该属性成为 App.Session 的属性(如我所料),但从那时起它也变得“不可设置”。很奇怪。无论如何,我可以忍受不初始化这些变量,但我更愿意理解为什么这在这里不起作用,但在 Ember 的其他任何地方都起作用(至少在控制器和路由对象中)。