2013-04-09 85 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)