Search code examples
ember.jsember-data

How do you automatically serialize and load an Ember Data object from a JSON response?


I have a UserSession model defined as such:

App.UserSession = DS.Model.extend({
  authToken: attr('string'),
  firstName: attr('string'),
  lastName: attr('string')
});

When a user is logging in, I'm making an AJAX POST request to my back-end which return a JSON representation such as:

{
  "user_session": {
    "id": 1,
    "auth_token": "token_here",
    "first_name": "John",
    "last_name": "Doe"
  }
}

Now normally, if I were to do the following, Ember Data would take care of automatically serializing the JSON and adding the object:

App.UserSession.find(<session-id>);

When I'm making a manual AJAX call though, is there an easy way to load the JSON returned into an Ember Data store object without having to manually deserialize it?

Edited for clarity:

The below does not work, but I'm hoping to find some function that does what's described above, which may look similar to the call below.

App.UserSession.load(<session-json>);

Solution

  • If you're using the latest version (11) of ember-data there is a breaking change for loading data.

    Loading Data

    Previously, some features of the store, such as load(), assumed a single adapter.

    If you want to load data from your backend without the application asking for it (for example, through a WebSockets stream), use this API:

    store.adapterForType(App.Person).load(store, App.Person, payload);
    

    This API will also handle sideloaded and embedded data. We plan to add a more convenient version of this API in the future.

    https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#loading-data

    You're going to want to grab the instance of your store. If you're in a controller you can do:

    @get('store')
    

    You can also do:

    App.__container__.lookup('store:main')
    

    which isn't recommended as it's using the internal API (noted by the __ surrounding the container call) which isn't guaranteed to not change.

    Once you have your instance of the store you can load in your UserSession:

    @get('store').adapterForType(App.UserSession).load(@get('store'), App.UserSession, sessionJson['user_session']);