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
extensing
Em.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
    冲突。