For the latest Angular, use ngx-jsonapi 🚀
We are ready for Angular 2 or above versions on ngx-jsonapi.
JsonApi client library for AngularJS + Typescript.
You can test library on this online example 👌 http://reyesoft.github.io/ts-angular-jsonapi/
Data is obtained from Json Api Playground.
- Cache (on memory): Before a HTTP request objects are setted with cached data.
- Cache (on memory): TTL for collections and resources
- Cache on localstorage
- Pagination
- Filtering by attributes through a string or a regular expression
- TS Definitions for strong typing and autocomplete (See example image)
- Include param support (also, when you save)
- Two+ equal resource request, only one HTTP call.
- Equal requests, return a same ResourceObject on memory
- Default values for a new resource
- Properties on collections like
$length
,$is_loading
or$source
(empty
|cache
|server
)
More information on examples section.
First of all, you need read, read and read Jsonapi specification.
npm install ts-angular-jsonapi --save
- Add Jsonapi dependency.
- Configure your url and other paramemeters.
- Inject JsonapiCore somewhere before you extend any class from
Jsonapi.Resource
.
import 'ts-angular-jsonapi';
var app = angular.module('yourAppName', ['rsJsonapi']);
app.config(['rsJsonapiConfig', (rsJsonapiConfig) => {
angular.extend(rsJsonapiConfig, {
url: '//jsonapiplayground.reyesoft.com/v2/'
});
}]);
var MyController = function(JsonapiCore) {
// ...
}
MyController.$inject = ['JsonapiCore'];
Like you know, the better way is with examples. Based on endpoints example library.
authors.service.ts
class AuthorsService extends Jsonapi.Resource {
type = 'authors';
public schema: Jsonapi.ISchema = {
attributes: {
name: { presence: true, length: { maximum: 96 } },
date_of_birth: {},
date_of_death: {},
created_at: {},
updated_at: {}
},
relationships: {
books: {},
photos: {}
}
};
}
angular.module('demoApp').service('AuthorsService', AuthorsService);
class AuthorsController {
public authors: any = null;
/** @ngInject */
constructor(AuthorsService) {
this.authors = AuthorsService.all();
}
}
<p ng-repeat="author in vm.authors">
id: {{ author.id }} <br />
name: {{ author.attributes.name }} <br />
birth date: {{ author.attributes.date_of_birth | date }}
</p>
Filter resources with attribute: value
values. Filters are used as 'exact match' (only resources with attribute value same as value are returned). value
can also be an array, then only objects with same attribute
value as one of values
array elements are returned.
let authors = AuthorsService.all(
{
localfilter: { name: 'xx' }, // request all data and next filter locally
remotefilter: { country: 'Argentina' } // request data with filter url parameter
}
);
From this point, you only see important code for this library. For a full example, clone and see demo directory.
let author = AuthorsService.get('some_author_id');
let author = AuthorsService.get(
'some_author_id',
{ include: ['books', 'photos'] },
success => {
console.log('Author loaded.', success);
},
error => {
console.log('Author don`t loaded. Error.', error);
}
);
TIP: these parameters work with all()
and save()
methods too.
let author = this.AuthorsService.new();
author.attributes.name = 'Pablo Reyes';
author.attributes.date_of_birth = '2030-12-10';
author.save();
let author = this.AuthorsService.new();
author.attributes.name = 'Pablo Reyes';
author.attributes.date_of_birth = '2030-12-10';
// some_book is an another resource like author
let some_book = this.BooksService.get(1);
author.addRelationship(some_book);
// some_publisher is a polymorphic resource named company on this case
let some_publisher = this.PublishersService.get(1);
author.addRelationship(some_publisher, 'company');
// wow, now we need detach a relationship
author.removeRelationship('books', 'book_id');
// this library can send include information to server, for atomicity
author.save( { include: ['book'] });
// mmmm, if I need get related resources? For example, books related with author 1
let relatedbooks = BooksService.all( { beforepath: 'authors/1' } );
// you need get a cached object? you can force ttl on get
let author = AuthorsService.get(
'some_author_id',
{ ttl: 60 } // ttl on seconds (default: 0)
);
let author = AuthorsService.get('some_author_id');
this.author.attributes.name += 'New Name';
this.author.save(success => {
console.log('author saved!');
});
let authors = AuthorsService.all(
{
// get page 2 of authors collection, with a limit per page of 50
page: { number: 2 ; limit: 50 }
}
);
- number: number of the current page
- limit: limit of resources per page (it's sended to server by url)
- information returned from server (check if is avaible) total_resources: total of avaible resources on server resources_per_page: total of resources returned per page requested
You can run JsonApi Demo App locally following the next steps:
git clone [email protected]:reyesoft/ts-angular-jsonapi.git
cd ts-angular-jsonapi
npm install -g gulp # if you are on linux, you need do this with sudo
npm install
gulp serve
We use as backend Json Api Playground.
First you need run the demo. Next, when you made new features on your fork, please run
gulp dist
And commit! Don't forget your pull request :)