|
| 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