我有一个带有登录表单的 Ember 应用程序,它在成功登录后以 JSON 格式返回当前用户。
UsingcreateRecord
直接在模型上设置返回的 JSON 属性。例如,is_private
变成user.is_private
,不是user.get('isPrivate')
?
如何加载用户模型以便正确设置属性并且不必使用 id 重新获取它?
我有一个带有登录表单的 Ember 应用程序,它在成功登录后以 JSON 格式返回当前用户。
UsingcreateRecord
直接在模型上设置返回的 JSON 属性。例如,is_private
变成user.is_private
,不是user.get('isPrivate')
?
如何加载用户模型以便正确设置属性并且不必使用 id 重新获取它?
截至几天前,在 ember data 1.0 beta 中,您可以使用pushPayload
将数据直接加载到存储中。例如,如果您通过 WebSockets 将数据推送到您的应用程序(我们使用 Heroku 插件Pusher)。您可以直接在商店(源)上调用它,它将通过适当的序列化程序传递它:
var postsJSON = {
posts: [
{id: 1, post_title: "Great post"}
]
}
this.store.pushPayload('post',postsJSON)
请注意,它当前不会加载单数对象(即post: {id: 1, post_title:"First!"}
) - 您需要使用数组将其格式化为复数。
DS.RESTSerializer
也有pushPayload
(source),在这种情况下,您需要将其传递给商店。
我强烈建议在使用之前阅读源代码,因为看起来它的实现将被重新审视。
据说,执行此操作的官方方法是使用adapter.load
,如该线程中所述:
加载数据中
以前,商店的某些功能,例如
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)
预期从服务器接收的格式相同,如RESTAdapter 指南中所述:
{
person: {
id: 1,
is_private: false,
projects: [3]
},
projects: [
{ id: 3, name: "FooReader" }
]
}
这将应用您使用配置的任何转换keyForAttributeName
(例如映射is_private
到isPrivate
),并将处理旁加载的记录。我不确定这是否是最佳做法,但效果很好。
怎么样store.push('user', userJSON)
?
http://emberjs.com/guides/models/pushing-records-into-the-store/#toc_pushing-records
上面的所有答案都对我不起作用。只对我有用的是:
this.store.buildRecord(this.store.modelFor('person'), data.id, data)