Ember-data-extensions

View the Project on GitHub jsonapi-suite/ember-data-extensions

Ember-Data Extensions

This is a collection of additions/alterations to ember-data to A) add convenience helpers and B) provide functionality not part of the default addon.

Nested Relations

You can now save full nested relation objects, specifying the relations during save():

post.save({
  adapterOptions: {
    relationships: ['tags', { author: 'state' }]
  }
});

The above would send the following JSONAPI payload to the server:

{
  data: {
    type: 'posts',
    relationships: {
      tags: {
        data: [
          { type: 'tags', attributes: { name: 'important' } },
          { type: 'tags', id: 123 }
        ]
      },
      author: {
        data: {
          type: 'authors',
          attributes: { name: 'Joe Author' },
          relationships: {
            state: {
              data: {
                type: 'states',
                id: 456
              }
            }
          }
        }
      }
    }
  }
}

You can disassociate an associated object by using markForDeletion. This will send a _delete attribute to the server:

post.get('tags.firstObject').markForDestruction();
post.save({ relationships: 'tags' });

Sends:

{
  data: {
    type: 'posts',
    relationships: {
      tags: {
        data: {
          type: 'tags',
          id: '123',
          attributes: { _delete: true }
        }
      }
    }
  }
}

If you want to destroy the associated record as well, use markForDestruction instead. This will send _destroy: true instead of _delete: true.

Dirty Properties

If an object is not dirty, we will only send its resource identifier (id/type) to the server (not the ember-data behavior). This is to solve a concurrency issue. Consider two users load the same post form, where user A edits the title and user B edits the description. User A submits the form first, then user B submits. User B would overwrite the title user A entered, even though they didn't change anything.

Since we only send dirty attributes to the server, this issue is mitigated as much as possible.