Browse Source

feat(core): add a utility service for easy TrackByFunction implementation

pull/3236/head
Arman Ozak 7 years ago
parent
commit
a1bf9980d0
  1. 18
      npm/ng-packs/packages/core/src/lib/services/track-by.service.ts
  2. 33
      npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts

18
npm/ng-packs/packages/core/src/lib/services/track-by.service.ts

@ -0,0 +1,18 @@
import { Injectable, TrackByFunction } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class TrackByService<ItemType = any> {
by<T = ItemType>(key: keyof T): TrackByFunction<T> {
return ({}, item) => item[key];
}
byDeep<T = ItemType>(...keys: (string | number)[]): TrackByFunction<T> {
return ({}, item) => keys.reduce((acc, key) => acc[key], item);
}
bySelf<T = ItemType>(): TrackByFunction<T> {
return ({}, item) => item;
}
}

33
npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts

@ -0,0 +1,33 @@
import { TrackByService } from '../services/track-by.service';
describe('TrackByService', () => {
const service = new TrackByService();
describe('#by', () => {
it('should return a function which tracks a property', () => {
expect(service.by('x')(284, { x: 1036 })).toBe(1036);
});
});
describe('#byDeep', () => {
it('should return a function which tracks a deeply-nested property', () => {
expect(
service.byDeep(
'a',
'b',
'c',
1,
'x',
)(284, {
a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } },
}),
).toBe(1036);
});
});
describe('#bySelf', () => {
it('should return a function which tracks the item', () => {
expect(service.bySelf()(284, 'X')).toBe('X');
});
});
});
Loading…
Cancel
Save