2013-04-09 63 views
7

我有一個Ember應用程序,其登錄表單在成功登錄後以JSON格式返回當前用戶。用EmberData手動加載模型

使用createRecord直接在模型上設置返回的JSON屬性。例如,is_private變成user.is_private,而不是user.get('isPrivate')

如何加載用戶模型,以便正確設置屬性,並且不必使用ID重新獲取它?

回答

7

據稱,正式的方式來做到這一點是使用adapter.load,如described in this thread

加載數據

以前,店裏的一些功能,如load(),假設 單個適配器。

如果要加載從你的後端數據,而不要求它(例如,通過的WebSockets流)的應用 ,使用此 API:

store.adapterForType(App.Person).load(store, App.Person, payload);

這個API還將把手側載和嵌入的數據。我們計劃在未來添加 這個更方便的API版本。

但不幸的是,它不處理sideloaded數據,儘管文檔聲稱。我個人使用類似於以下,這是基於怎樣find(ID)實現:

var id = json["person"]["id"]; 
var store = DS.get("defaultStore"); 
var adapter = store.adapterForType(App.Person); 
adapter.didFindRecord(store, App.Person, json, id); 
var person = App.Person.find(id); 

請注意,此代碼假定JSON在同一格式find(ID)希望從服務器接收,因爲documented in the RESTAdapter guide

{ 
    person: { 
    id: 1, 
    is_private: false, 
    projects: [3] 
    }, 
    projects: [ 
    { id: 3, name: "FooReader" } 
    ] 
} 

這將應用您使用keyForAttributeName配置的任何轉換(例如將is_private映射到isPrivate),並且它將處理側載記錄。我不確定這是否是最佳做法,但效果很好。

+0

Thanks!我接近'didFindRecord',但我不確定我完全知道該方法正在發生什麼。 – bschaeffer 2013-04-09 17:56:26

+0

嗨。當我填充單個記錄時,這個轉換效果非常好。我如何填充多個記錄?例如:http://pastebin.com/raw.php?i=NNFVDYR0 – Mattia 2013-05-11 14:18:24

+1

據我可以告訴這不再工作在燼數據1.0.0-beta.3我用這個在燼數據0.14但我最終使用了1.0.0-beta.3給出的答案:http://stackoverflow.com/a/18948134/1477165 – bfcoder 2013-11-07 02:11:21

8

截至前幾天在燼數據1.0測試版中,您可以使用pushPayload將數據直接加載到商店中。例如,如果您通過WebSockets將數據推送到您的應用程序(我們使用Heroku插件Pusher)。您可以直接調用它的存儲(source),它會傳遞通過相應的串行:

var postsJSON = { 
    posts: [ 
    {id: 1, post_title: "Great post"} 
    ] 
} 

this.store.pushPayload('post',postsJSON) 

請注意,目前不會加載一個單一對象(即post: {id: 1, post_title:"First!"}) - 你需要把它格式化爲具有多個一個數組。

DS.RESTSerializer具有pushPayload以及(source),在這種情況下,你需要將它傳遞店裏來代替。

我強烈建議使用前閱讀源代碼,因爲它看起來像它的實施將是rev isited。

+2

我完全認爲這會打破某個時間,但至少這是現在的作品。我希望它不會。我不得不把我的json變成一個只有單個對象的數組。 – bfcoder 2013-11-07 02:10:31

+0

這是一年前發佈的,今天仍然完美,我猜這是留在這裏。 – 2015-12-21 18:30:42

0

以上所有答案都不適用於我。 只對我有效的是:

this.store.buildRecord(this.store.modelFor('person'), data.id, data)