我有一个带有登录表单的Ember应用程序,在成功登录后以JSON格式返回当前用户。
使用createRecord
直接在模型上设置返回的JSON属性。例如,is_private
变为user.is_private
,而不是user.get('isPrivate')
?
如何加载用户模型以便正确设置属性并且我不必使用id重新获取它?
答案 0 :(得分:8)
截至几天前,在ember data 1.0 beta中,您可以使用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),在这种情况下,您需要将商店传递给它。
我非常鼓励在使用之前阅读源代码,因为看起来它的实现将会被重新审视。
答案 1 :(得分:7)
据说,执行此操作的官方方法是使用adapter.load
,described in this thread:
正在加载数据
以前,商店的某些功能(例如
load()
)假定为 单适配器。如果您想在没有应用程序的情况下从后端加载数据 要求它(例如,通过WebSockets流),使用它 API:
store.adapterForType(App.Person).load(store, App.Person, payload);
此API还将处理侧载和嵌入数据。我们打算补充一下 将来这个API的更方便的版本。
但不幸的是,尽管文档声称,但它并没有处理侧载数据。我个人使用以下内容,它基于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
),并且它将处理旁加载的记录。我不确定这是否是最佳做法,但效果很好。
答案 2 :(得分:4)
store.push('user', userJSON)
怎么样?
http://emberjs.com/guides/models/pushing-records-into-the-store/#toc_pushing-records
答案 3 :(得分:0)
上述所有答案对我都不起作用。 只对我有用的是:
this.store.buildRecord(this.store.modelFor('person'), data.id, data)