8

我有一个带有登录表单的 Ember 应用程序,它在成功登录后以 JSON 格式返回当前用户。

UsingcreateRecord直接在模型上设置返回的 JSON 属性。例如,is_private变成user.is_private,不是user.get('isPrivate')

如何加载用户模型以便正确设置属性并且不必使用 id 重新获取它?

4

4 回答 4

9

截至几天前,在 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也有pushPayloadsource),在这种情况下,您需要将其传递给商店。

我强烈建议在使用之前阅读源代码,因为看起来它的实现将被重新审视。

于 2013-09-22T19:55:16.063 回答
7

据说,执行此操作的官方方法是使用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_privateisPrivate),并将处理旁加载的记录。我不确定这是否是最佳做法,但效果很好。

于 2013-04-09T16:30:08.737 回答
5

怎么样store.push('user', userJSON)

http://emberjs.com/guides/models/pushing-records-into-the-store/#toc_pushing-records

于 2013-11-04T15:57:30.660 回答
0

上面的所有答案都对我不起作用。只对我有用的是:

this.store.buildRecord(this.store.modelFor('person'), data.id, data)
于 2017-01-03T09:02:09.367 回答