Skip to content

Commit eae2261

Browse files
authored
Merge pull request #1410 from SergeAstapov/docs-transform
docs: add Ember Data transform page
2 parents 47b7a07 + c06c717 commit eae2261

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

docs/ember-data/transforms.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Transforms
2+
3+
`DS.attr` defines an attribute on a [DS.Model](https://guides.emberjs.com/release/models/defining-models/).
4+
By default, attributes are passed through as-is, however you can specify an
5+
optional type to have the value automatically transformed.
6+
Ember Data ships with four basic transform types: `string`, `number`, `boolean` and `date`.
7+
8+
You can define your own transforms by subclassing [DS.Transform](https://guides.emberjs.com/release/models/defining-models/#toc_custom-transforms).
9+
Ember Data transforms are normal TypeScript classes.
10+
The return type of `deserialize` method becomes type of the model class property.
11+
12+
You may define your own transforms in TypeScript like so:
13+
```typescript
14+
# app/transforms/coordinate-point.ts
15+
import Transform from '@ember-data/serializer/transform';
16+
17+
declare module 'ember-data/types/registries/transform' {
18+
export default interface TransformRegistry {
19+
'coordinate-point': CoordinatePointTransform;
20+
}
21+
}
22+
23+
export type CoordinatePoint = {
24+
x: number;
25+
y: number;
26+
};
27+
28+
export default class CoordinatePointTransform extends Transform {
29+
deserialize(serialized): CoordinatePoint {
30+
return { x: value[0], y: value[1] };
31+
}
32+
33+
serialize(value): number {
34+
return [value.x, value.y];
35+
}
36+
}
37+
38+
# app/models/cursor.ts
39+
import Model, { attr } from '@ember-data/model';
40+
import { CoordinatePoint } from 'agwa-data/transforms/coordinate-point';
41+
42+
declare module 'ember-data/types/registries/transform' {
43+
export default interface ModelRegistry {
44+
cursor: Cursor;
45+
}
46+
}
47+
48+
export default class Cursor extends Model {
49+
@attr('coordinate-point') declare position: CoordinatePoint;
50+
}
51+
```
52+
53+
Note that you should declare your own transform under `TransformRegistry` to make `attr` to work with your transform.

0 commit comments

Comments
 (0)