https://github.com/pluff/angular-identity-map
Identity map implementation for AngularJS
https://github.com/pluff/angular-identity-map
Last synced: about 1 year ago
JSON representation
Identity map implementation for AngularJS
- Host: GitHub
- URL: https://github.com/pluff/angular-identity-map
- Owner: pluff
- License: mit
- Created: 2014-03-20T18:17:05.000Z (about 12 years ago)
- Default Branch: master
- Last Pushed: 2014-12-16T21:48:32.000Z (over 11 years ago)
- Last Synced: 2025-04-12T17:54:39.393Z (about 1 year ago)
- Language: CoffeeScript
- Homepage:
- Size: 283 KB
- Stars: 6
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## angular-identity-map
An [identity map pattern](http://en.wikipedia.org/wiki/Identity_map_pattern) implementation for AngularJS applications.
## Requirements
AngularJS v1.0+
traverse
## Getting started
### with bower
Just include "angular-identity-map" to your dependencies list and run `bower install`
### with npm
`npm install angular-identity-map`
### manually
Download [angular-identity-map.js](https://raw.githubusercontent.com/pluff/angular-identity-map/master/dist/angular-identity-map.min.js) and include it on your page along with AngularJS
Add `identity-map` to your module dependencies
```javascript
angular.module('myApp', ['identity-map']);
```
## Usage
### Pre-requirements
All objects you want to map must have `id` attribute and `class_name` attribute in order to retrieve object identification pair. This pair (class_name, id) MUST be unique.
Both these behaviors can be customized. See Configuration chapter below.
### All you need is .map
```javascript
var myAppModule = angular.module("MyApp", ["identity-map"]);
myAppModule.controller("myController", function($scope, IdentityMap) {
$scope.phoneList = [
{id: 1, class_name: 'Phone', name: 'Emergency', value: '911'}
];
IdentityMap.map($scope.phoneList);
//Let's assume you somehow retrieved new phone list e.g. by using Restangular
newPhoneList = [
{id: 1, class_name: 'Phone', name: 'Emergency', value: 'call-911'},
{id: 2, class_name: 'Phone', name: 'Mommy', value: '12345'}
];
IdentityMap.map(newPhoneList);
$scope.phoneList[0].value; // "call-911"
//However your $scope.phoneList still has 1 item, while newPhoneList has 2 items.
//Remember, IdentityMap stores objects only.
}
```
You can see and play around with [live demo](http://plnkr.co/edit/jDiMgjnQYitBYTx9Mqth?p=preview)!
### Others methods for those, who want to dig deeply into identity map
There are several methods available such as `.get`, `.set`, `.detach`, `.clear` etc.
Check out the source code for more information.
### Configuration
identity-map stores and retrieves object using object type and object id.
By default object id is retrieved by calling `id` attribute on an object. Object type retrieved by calling `class_name` attribute on an object.
These functions are configurable in service provider:
Example:
```javascript
app.config(function(IdentityMapProvider) {
//retrieves object type for mapping from object constructor name.
IdentityMapProvider.setEntityTypeFn(function(entity) {
return entity.constructor.name;
});
//retrieves object id for mapping by calling "getGlobalId" function.
IdentityMapProvider.setEntityFn(function(type, entity) {
return entity.getGlobalId();
});
});
```
Please pay attention to couple requirements for these functions:
1. Any pair of (entityType, entityId) values MUST represent one and only one entity object.
2. Both functions accept one param which is guaranteed to be an object. If `entity` param is not a mappable object both functions MUST return `undefined`.
More examples can be found in spec/IdentityMap_spec.coffee
### Integration with Restangular
"identity-map" can be integrated with Restangular easily.
You just need to add simple response interceptor to Restangular stack:
```javascript
angular.module('myApp', ['restangular', 'identity-map']).run(
function (Restangular, IdentityMap) {
Restangular.addResponseInterceptor(
function (data, operation, what, url, response, deffered) {
return IdentityMap.map(data);
}
);
});
```
Starting from now any Restangular response with "mappable" objects will be mapped automatically.
## Development
Code quality is ensured with CoffeeScript, CoffeeLint, and Karma.
```sh
npm install -g grunt-cli
npm install && bower install
grunt
```
### Live Reloading
```sh
grunt karma:unit:start watch
```
### Build
```sh
grunt dist
```
## TODO
See [issues list](https://github.com/pluff/angular-identity-map/issues?q=is%3Aopen)
## Contribute
1. Fork
2. Code
3. Submit PR
## License
[MIT](https://raw.githubusercontent.com/pluff/angular-identity-map/master/LICENSE)