ember-data-meta-links-improvements
v0.0.2
Published
POC for https://github.com/emberjs/rfcs/pull/160
Downloads
4
Readme
ember-data-meta-links-improvements
Proof of Concept for RFC#160.
This addon is a Proof of Concept for RFC#160 which aims to improve the meta and links situation within Ember Data. The goal is to see how the proposed API solves use cases when used in real applications. The outcome of this addon should be a profound test suite which covers all the use cases of the RFC.
:warning: The current implementation heavily relies on patches of Ember Data internals, so it is definitely not encouraged to use in production, as stability and decent performance can not be guaranteed. :warning:
Currently the following improvements are implemented:
- [x] single record meta data (tests)
- [x] get record level meta data via
record.ref().meta()
- [x] get response level meta data for single resource via
record.ref().meta("response")
- [x] get record level meta data via
- [ ] links for relationship references
- [ ] meta and links for finders
- [ ] get reference for has-many via
hasManyRelationship.ref()
- [ ] get parent reference for relationship reference
- [ ] belongs to
- [ ] has many
- [ ] add hook when new data is received
- [ ]
Model#didReceiveData
- [ ]
- [ ] further miscellaneous changes
- [x] get parent reference of link via
linkRef.parentRef()
- [x] get parent reference of link via
Installation
ember install ember-data-meta-links-improvements
Code samples
Single record meta data
// GET /books/1
// {
// data: {
// type: "book",
// id: 1,
// meta: {
// recordLevel: true
// }
// },
// meta: {
// topLevel: true
// }
// }
this.store.findRecord('book', 1).then(function(book) {
// get reference for record
let bookRef = book.ref();
// get record level meta data
let meta = bookRef.meta();
meta === { recordLevel: true };
// get response level meta data
let topLevelMeta = bookRef.meta("response");
topLevelMeta === { topLevel: true };
});
Has-many links
// GET /books/1
// {
// data: {
// type: "book",
// id: 1,
// relationships: {
// chapters: {
// links: {
// related: "related-link",
// self: {
// href: "self-link",
// meta: {
// selfLink: true
// }
// }
// }
// }
// }
// }
// }
this.store.findRecord('book', 1).then(function(book) {
let chaptersRef = book.hasMany("chapters");
let related = chaptersRef.links("related");
related.href() === "related-link";
let next = chaptersRef.links("self");
next.meta() === { selfLink: true };
// GET /self-link
// {
// data: [],
// meta: {
// isSelf: true
// }
// }
next.load().then(function(nextArray) {
nextArray.ref().meta() === { isSelf: true }
});
});
store.query
// GET /books?page=2
// {
// data: [{
// type: "book",
// id: 1
// }],
// links: {
// next: {
// href: "/books?page=3",
// meta: {
// isLast: true
// }
// },
// prev: {
// href: "/books?page=1"
// }
// },
// meta: {
// total: 123
// }
// }
let books = await this.store.query('book', { page: 2 }).then(function(books) {
let booksRef = books.ref();
let prev = booksRef.links("prev");
prev.href() === "/books?page=1";
let next = booksRef.links("next");
next.meta() === { isLast: true };
let meta = booksRef.meta();
meta === { total: 123 };
});
// GET /books?page=3
// {
// data: [{
// type: "book",
// id: 1
// }],
// links: {
// prev: {
// href: "/books?page=2"
// }
// },
// meta: {
// isLastPage: true
// }
// }
let next = await books.ref().links("next").load();
next.ref().meta() === { isLastPage: true }
store.findAll
// GET /books
// {
// data: [{
// type: "book",
// id: 1
// }],
// links: {
// self: "self-link"
// },
// meta: {
// total: 123
// }
// }
let books = await this.store.findAll('book');
let booksRef = books.ref();
let self = booksRef.links("self");
self.href() === "self-link";
let meta = booksRef.meta();
meta === { total: 123 };
// GET /books
// {
// data: [{
// type: "book",
// id: 1
// }],
// meta: {
// total: 456
// }
// }
await this.store.findAll('book', { reload: true });
booksRef.meta() === { total: 456 };
Development
Installation
git clone
this repositorynpm install
bower install
Running
ember serve
- Visit your app at http://localhost:4200.
Running Tests
npm test
(Runsember try:testall
to test your addon against multiple Ember versions)ember test
ember test --server
Building
ember build
For more information on using ember-cli, visit http://ember-cli.com/.