0

最奇怪的问题。我已将“会话”对象注入所有控制器:

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

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

3 回答 3

0

If my understanding is correct, you might have gone some misunderstanding with Em.O initialisation.

Whenever you create a instance of a class (in this case App.Session extending Em.Object.extend) , the properties in the class will be set in __proto__ of the created instances. These properties will shared among the instances created from this class.

When you set the property using Em.set, the properties will be set as the OwnProperties of the instance rather than overriding the prototype properties and when you get a property using Em.get, the property are looked upon the OwnProperty first, if not found it will be looked upon the prototype chain till it reaches the root.

Ex Fiddles:

Fiddle-1 Fiddle-2

Sorry if i missed your point completely

于 2013-11-14T17:51:06.817 回答
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 注册为单例,然后确保存储可用于会话对象,最后将会话属性插入每个控制器。

从那里会话对象本身:

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

这很有效——暂时假设为currentUserIDandaccessToken设置了一个 cookie。伟大的。显然 Session 中还有一些代码要构建,但为什么我还是觉得有点不舒服?两个原因:

  1. 名称冲突。我最初只是打电话currentUserIDuserId但只是做一个简单的名字交换会使这个解决方案陷入混乱。那么混乱可能有点极端,但它肯定会开始行为不端。我偶然遇到了这个。

  2. 内容数组。我仍然不能像currentUserID我通常想做的那样初始化任何属性。当我这样做时,该属性成为 App.Session 的属性(如我所料),但从那时起它也变得“不可设置”。很奇怪。无论如何,我可以忍受不初始化这些变量,但我更愿意理解为什么这在这里不起作用,但在 Ember 的其他任何地方都起作用(至少在控制器和路由对象中)。

于 2013-11-14T18:31:44.883 回答
0

如果您覆盖 init 方法,可能会忘记调用超类 init。

尝试添加到您的 init 方法

init:function(){
     this._super();
     //your code
}

祝你好运

于 2013-11-14T15:12:35.700 回答