最奇怪的问题。我在所有控制器中注入了一个“session”对象:
this.inject('controller','session','session:current');
我将设置accessToken
和userId
属性,但如果我将这些属性初始化为null
,则它们永远不会被设置。初始化只不过是:
App.Session = Ember.Object.extend({
userId: null,
accessToken: null
})
上面初始化的结果,即使它后面跟着set(),也是这样:
如果我没有设置它们,那么set()调用设置这些属性:
init()方法中的set调用是:
this.set('accessToken', $.cookie('access_token'));
this.set('userId', $.cookie('userId'));
感觉就像我之前已经做了1000次没有问题,但这里发生了一些奇怪的事情。任何帮助将不胜感激。
----更新----
以下是其他上下文的init()
函数:
init: function() {
this._super();
console.log("Session started");
this.set('accessToken', $.cookie('access_token'));
this.set('userId', $.cookie('userId'));
this.loginStatus();
},
答案 0 :(得分:0)
如果覆盖init方法,则可能忘记调用超类init。
尝试添加到init方法
init:function(){
this._super();
//your code
}
祝你好运
答案 1 :(得分:0)
如果我的理解是正确的,你可能会对Em.O初始化产生一些误解。
每当您创建一个类的实例(在这种情况下App.Session
扩展Em.Object.extend
)时,类中的属性将在创建的实例的__proto__
中设置。这些属性将在从此类创建的实例之间共享。
使用Em.set
设置属性时,属性将设置为实例的OwnProperties
,而不是覆盖原型属性,当您使用Em.get
获取属性时,首先查看OwnProperty属性,如果没有找到它将被查看原型链直到它到达根。
Ex Fiddles:
很抱歉,如果我完全错过了你的观点
答案 2 :(得分:0)
我厌倦了尝试让我的代码工作,所以从头开始,一块一块地建立起来。我想我已经发现了我的问题的核心,它是名字冲突。公平地说,我仍然对此感到困惑......
这是注册和注入过程:
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注册为单例,然后确保存储可用于会话对象,最后将会话属性插入每个控制器。
从那里开始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
和accessToken
的Cookie。大。在Session中显然会有更多的代码要构建,但为什么我仍然觉得有点不舒服?有两个原因:
名称冲突。我最初只调用了currentUserID
userId
,但只是简单地交换名称会使这个解决方案陷入混乱。混乱可能有点极端,但它肯定会开始行为不端。我偶然遇到了这种情况。
内容数组。我仍然无法像我通常想要的那样初始化currentUserID
之类的任何属性。当我这样做时,属性成为App.Session的属性(正如我所期待的那样),但从那时起它也变得“不可设置”。很奇怪。好吧无论如何,我可以忍受没有初始化这些变量,但我更愿意理解为什么这在这里不起作用,但在Ember的其他地方工作(至少在Controllers和Route对象中)。