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.
Currently the following improvements are implemented:
- single record meta data (tests)
- get record level meta data via
record.ref().meta()
- get response level meta data for single resource via
record.ref().meta("response")
- get record level meta data via
- single record links
- links for relationship references
- meta and links for finders
- get reference for has-many via
hasManyRelationship.ref()
- get parent reference for relationship reference
- add hook when new data is received
-
Model#didReceiveData
-
- further miscellaneous changes
- get parent reference of link via
linkRef.parentRef()
- get parent reference of link via
ember install ember-data-meta-links-improvements
// 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 };
});
// 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 }
});
});
// 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 }
// 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 };
git clone
this repositorynpm install
bower install
ember serve
- Visit your app at http://localhost:4200.
npm test
(Runsember try:testall
to test your addon against multiple Ember versions)ember test
ember test --server
ember build
For more information on using ember-cli, visit http://ember-cli.com/.