Ember.js Can';你不能去恩伯的酒店吗?
最奇怪的问题。我已将“会话”对象注入所有控制器:Ember.js Can';你不能去恩伯的酒店吗?,ember.js,Ember.js,最奇怪的问题。我已将“会话”对象注入所有控制器: this.inject('controller','session','session:current'); 我将设置accessToken和userId属性,但如果我将这些属性初始化为null,则它们永远不会被设置。初始化只不过是: App.Session = Ember.Object.extend({ userId: null, accessToken: null }) 上述初始化的结果,即使后面跟着下面的set(),如下
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();
},
如果跳过init方法,可能会忘记调用超类init 尝试添加到您的init方法
init:function(){
this._super();
//your code
}
祝你好运如果我的理解是正确的,你可能会对Em.O的初始化产生一些误解 无论何时创建类的实例(在本例中为
App.Session
extensingEm.Object.extend
),类中的属性都将在所创建实例的\uuuuuuuuuuu
中设置。这些属性将在从此类创建的实例之间共享
当您使用Em.set
设置属性时,属性将被设置为实例的OwnProperties
,而不是覆盖原型属性。当您使用Em.get
获取属性时,首先查看OwnProperty,如果找不到,将查看原型链,直到它到达根
前小提琴手:
很抱歉,如果我完全没有领会你的观点,我已经厌倦了让我的代码正常工作,所以从零开始,一块一块地构建。我想我已经揭开了问题的核心,那就是名字冲突。平心而论,我仍然对这件事感到困惑 以下是注册和注入过程:
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');
}
});
这很有魅力。首先将会话注册为单例,然后确保存储对会话对象可用,最后将会话属性插入每个控制器
从这里开始会话对象本身:
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。伟大的显然,会话中还有一些代码需要构建,但为什么我仍然感到有点不舒服?原因有二:
currentUserID
只是userId
,但仅仅做一个简单的名称交换就把这个解决方案弄得一团糟。混乱可能有点极端,但它肯定会开始行为不端。我是偶然碰到这个的currentUserID
。当我这样做时,该属性将成为App.Session的属性(正如我所期望的),但从那时起它也将成为“不可设置的”。很奇怪。无论如何,我可以接受不初始化这些变量,但我更愿意理解为什么这在这里不起作用,但在Ember中的其他任何地方都起作用(至少在控制器和路由对象中)谢谢,但我确实有电话给_super()。。。我将更新问题以包含完整的函数。好的,对不起,这是一个典型的emberist错误:-)我已经做了很多次,其中init function()、在ApplicationController内部还是在App.Session内部。。。我错过了你的问题吗???你能解决你的问题吗???这是密码:把你搞错了?????我同意你的看法,这也是我的理解。我已经发布了一个我不太满意的“答案”,但它可能会帮助你更好地理解我正在努力解决的问题。此外,我的回答中还包含一些问题,您可能对此有所了解。:)我找不到你的答案!!我正在打字:)它现在在那里。哦,该死的。我想名字冲突已经解释清楚了。。。没有意识到
userIdObserver
会与userId
冲突。