使用EmberData手动加载模型

时间:2013-04-09 16:08:10

标签: ember.js ember-data

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

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

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

4 个答案:

答案 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也有pushPayloadsource),在这种情况下,您需要将商店传递给它。

我非常鼓励在使用之前阅读源代码,因为看起来它的实现将会被重新审视。

答案 1 :(得分:7)

据说,执行此操作的官方方法是使用adapter.loaddescribed 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)

答案 3 :(得分:0)

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

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