2014-09-25 32 views
1

我想這個解決方案,以獲取當前用戶之前我的應用程序呈現給用戶:獲取當前用戶(「用戶」,「我」)存儲無效用戶實例

Em.Route.extend({ 
    model: function() { 
     var currentUserPromise = this.store.find('user', 'me'); 

     return Em.RSVP.all([ 
      currentUserPromise 
     ]); 
    } 
}); 

所以,我查詢user ID me,這是一個常數,我的API認爲是當前通過身份驗證的用戶。

大多數情況下,它工作得非常好。問題是Ember-Data立即在商店中創建一個用戶模型,其ID等於me,並且沒有其他屬性。響應到達後,此實例不會被刪除,Ember-Data會正確存儲真實的用戶模型。

The temporary and real instances

我無法揣摩出灰燼,數據創建這個臨時的實例,如果有一種方法可以阻止這種行爲。

要麼是防止Ember-Data創建臨時文件的解決方案。或者當實際數據到達時將其刪除將會很好。

任何人都有解決方案嗎?

+0

您使用的是哪個版本的ember數據?在燼數據1.0.0.beta-8這工作正常。 – 2014-09-25 17:37:29

回答

1

與#emberjs諮詢後,我發現一個更清潔的解決了這個挑戰是從我的API請求會話對象,請求活動用戶。

通過在我的API中公開一個/sessions端點,我可以將當​​前會話(也包括身份驗證令牌等)暴露給當前登錄的配置文件。這導致了JSON有效載荷是這樣的:

{ 
    "sessions": [ 
    { 
     "id": 1, 
     "user": { ... }, 
     "accessToken": "abcdef1234567890" 
    } 
    ] 
} 

這意味着我將不再有問題,那灰燼,數據緩存id爲「我」一個假的用戶對象,而不是我現在有一個會話對象活動用戶正確加載到商店並通過會話使其可用。

0

我認爲你會以錯誤的方式去做事情。您處於單頁面應用程序中,這意味着用戶可以隨時註銷或登錄,並且任何渲染實際上在其之前和之後都已經發生。您只能控制允許渲染的內容,而不能控制渲染時間。

另外,您正在顯式返回一組承諾,它解決何時包含它的單個承諾已解決。這實現了相同的:

Em.Route.extend({ 
    model: function() { 
     return this.store.find('user', 'me'); 
    } 
}); 

你不知道什麼時候會解決,但你問到「之前,應用程序呈現給用戶獲取用戶」。這不是它在Ember中的工作原理,因爲你無法真正延遲渲染。 (從技術上講,你可以,但是這會給瀏覽器鎖住的感覺帶來可怕的用戶體驗)。

你想要做的事情就是根據登錄用戶的狀態修改你正在渲染的內容,而在後端你只發送該用戶允許看到的內容。其他任何事情都是不安全的,因爲你永遠不會相信瀏覽器。使Ember應用程序認爲您已登錄,這非常簡單。

問題是,Ember-Data會立即在存儲中創建一個用戶模型,並且此ID不變,而且沒有其他屬性。

我不確定那個;我猜測ember-data在等待真實數據的人口時創建了一個佔位符(如果有的話)。就好像你正在代碼中創建一個新的空對象。

我無法揣摩出灰燼,數據創建這個臨時實例

灰燼數據是在其核心基本上是一個緩存(爲什麼它被稱爲商店)與各種適配器從讀並寫入該緩存和一個API來使用它。在您的示例中,me僅在緩存中創建,至少在您決定保存之前。

+0

1.我發佈的代碼只是我的實際應用程序的一部分,我有更多的需要解決的承諾,因此RSVP.all存在。 2.問題恰恰是緩存。我確實找到了一個更清晰的解決方案,我通過'/ session'端點和'session'模型獲取活動用戶。 – 2014-09-25 19:38:21

0

Ember數據修改相同的記錄,而不是在實現後創建新記錄。查找表格的記錄時可能還有其他一些問題。例如在ember數據1.0.0-beta.8中,以下代碼記錄正確的id,而不是打印'me'。

this.store.find('user', 'me').then(function(user) { 
    console.log(user.get('id')); 
});