无法进入Ember的房产?

时间:2013-11-14 14:46:19

标签: ember.js

最奇怪的问题。我在所有控制器中注入了一个“session”对象:

this.inject('controller','session','session:current');

我将设置accessTokenuserId属性,但如果我将这些属性初始化为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();
},

3 个答案:

答案 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:

Fiddle-1 Fiddle-2

很抱歉,如果我完全错过了你的观点

答案 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')
});

这很有效 - 假设设置了currentUserIDaccessToken的Cookie。大。在Session中显然会有更多的代码要构建,但为什么我仍然觉得有点不舒服?有两个原因:

  1. 名称冲突。我最初只调用了currentUserID userId,但只是简单地交换名称会使这个解决方案陷入混乱。混乱可能有点极端,但它肯定会开始行为不端。我偶然遇到了这种情况。

  2. 内容数组。我仍然无法像我通常想要的那样初始化currentUserID之类的任何属性。当我这样做时,属性成为App.Session的属性(正如我所期待的那样),但从那时起它也变得“不可设置”。很奇怪。好吧无论如何,我可以忍受没有初始化这些变量,但我更愿意理解为什么这在这里不起作用,但在Ember的其他地方工作(至少在Controllers和Route对象中)。