2013-11-14 37 views
0

最奇怪的問題。我已經注入了「會話」對象到所有控制器:無法進入Ember中的屬性?

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

我要設置accessTokenuserId性能,但如果我初始化這些屬性null那麼他們永遠不會設置。初始化無非是:

App.Session = Ember.Object.extend({ 
    userId: null, 
    accessToken: null 
}) 
從下面

上述初始化,即使它隨後集(的結果)是這樣的:

如果我不將它們設置然後該組()調用設置這些屬性:

在init()方法的調用集合是:

this.set('accessToken', $.cookie('access_token')); 
this.set('userId', $.cookie('userId')); 

感覺我已經做了1000次之前沒有問題,但有些奇怪的事情發生在這裏。任何幫助將不勝感激。

---- ---- UPDATE

下面是更多的上下文init()功能:

init: function() { 
    this._super(); 
    console.log("Session started"); 
    this.set('accessToken', $.cookie('access_token')); 
    this.set('userId', $.cookie('userId')); 
    this.loginStatus(); 
}, 
+0

http://jsfiddle.net/selvaG/NXnYG/4/ ...我錯過任何你的概率?你可以擺弄你的問題嗎? – selvagsz

+0

這裏是代碼:http://codepen.io/kensnyder/pen/hxJot – ken

+0

你錯了嗎??????? – selvagsz

回答

0

如果您在此改變init方法,就可以忘記調用超類的init 。

嘗試添加到您的init方法

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

好運

+0

謝謝,但我確實已經打電話給_super()...我將更新問題以包含完整功能。 – ken

+0

對不起,是一個典型的emberist錯誤:-)我做了很多次 – Edu

+0

initControl(),在ApplicationController裏面還是在App.Session裏面 – Edu

0

如果我的理解是正確的,你可能出現了一些誤會與Em.O初始化。

無論何時創建類的實例(在這種情況下,App.Session延伸Em.Object.extend),該類中的屬性將在創建的實例的__proto__中設置。這些屬性將在從此類創建的實例中共享。

當您設置使用Em.set屬性,該屬性將被設置爲實例的OwnProperties而不是覆蓋原型的屬性,當你使用Em.get的屬性,該屬性是於OwnProperty看着第一,如果沒有找到它將被視爲原型鏈,直到它到達根部。

防爆小提琴:

Fiddle-1 Fiddle-2

很抱歉,如果我錯過了你的觀點完全

+0

我同意你的意思,那是我的也瞭解。我發佈了一個「我不太滿意的答案」,但它可以幫助你更好地理解我正在努力掙扎的東西。此外,我的答案中還有一些嵌入式問題,您可能會對此有所瞭解。 :) – ken

+0

我找不到你的答案! – selvagsz

+0

我正在打字:)現在就在那裏。 – ken

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

此工程 - 承擔,對於currentUserIDaccessToken一個cookie設置了一會兒。大。 Session中有很多代碼需要構建,但爲什麼我仍然感覺有點不舒服?兩個原因:

  1. 名稱衝突。我原本叫currentUserID只是userId但只是做一個簡單的名稱交換拋出這個解決方案混亂。好混沌可能有點極端,但它肯定會開始行爲不端。我偶然遇到了這種情況。

  2. 內容數組。我仍然無法初始化任何像currentUserID這樣的屬性,因爲我通常會這樣做。當我這樣做時,該屬性成爲App.Session的一個屬性(正如我所期望的那樣),但是從這一點開始,它也變成了「不可設置」。很奇怪。無論如何,我可以接受不初始化這些變量,但我更願意理解爲什麼這不起作用,但在Ember的其他地方(至少在控制器和路由對象中)工作。

+0

哦,狗屎。我認爲這個名稱衝突已經被解釋了......沒有意識到'userIdObserver'會和'userId'衝突。 – ken

相關問題