Modèles de données

Ember-data est une librairie permettant d’agir comme intermédiaire entre l’API d’un serveur et l’application Ember, qui va s’occuper d’effectuer les requêtes, sérialiser et désérialiser les données en objets, et mettre en cache les données — autrement dit, c’est un ORM. Elle est installée par défaut dans les applications générées par Ember CLI.

1. Définir un modèle


2. Utiliser le store


3. Créer un adapter (optionnel)

Customizing Adapters


4. Créer un serializer (optionnel)

Customizing Serializers


Types personnalisés

  1. Créer un objet Transform
    app/transforms/null-boolean.js:

     import Transform from '@ember-data/serializer/transform';
     import { isNone } from '@ember/utils';
    
     /**
      * [NullBooleanTransform description]
      *
      * @class NullBooleanTransform
      */
     export default class NullBooleanTransform extends Transform {
       deserialize(serialized) {
         var type = typeof serialized;
    
         if (isNone(serialized)) {
           return null;
         }
    
         if (type === 'boolean') {
           return serialized;
         } else if (type === 'string') {
           return serialized.match(/^true$|^t$|^1$/i) !== null;
         } else if (type === 'number') {
           return serialized === 1;
         }
         return false;
       }
    
       serialize(deserialized) {
         if (isNone(deserialized)) {
           return null;
         }
         return Boolean(deserialized);
       }
     }
    
  2. Utiliser ce transform comme type

     @attr('null-boolean') hasChanges;
    

Relations

Option async

Option inverse

Option polymorphic


Propriétés calculées

Package @ember/object/computed

Macros personnalisées

  1. On peut créer une macro personnalisée, qui est simplement une fonction retournant une fonction @computed
    app/macros/age-format.js:

     import { computed, get } from '@ember/object';
    
     /**
      * Returns a string like "28 years old" according to age.
      *
      * @param  {String} ageKey
      * @return {String}
      */
     export default function (ageKey) {
       return computed(ageKey, function () {
         var age = get(this, ageKey);
         if (age) {
           return `${age} years old`;
         }
         return;
       });
     }
    
  2. Utiliser cette macro
    app/models/record.js:

     import ageFormat from 'emberjs/macros/age-format';
    
     //...
       @ageFormat('age') ageFormated;
    

Mixins

  1. Créer une mixin
    app/mixins/record-history.js:

     import Mixin from '@ember/object/mixin';
    
     export default Mixin.create({
       trackingRecord: null,
       record: null,
       hasChanges: null,
     });
    
  2. Utiliser la mixin
    app/models/tracking-record-history.js:

     import Model from 'ember-data/model';
     import attr from 'ember-data/attr';
    
     import RecordHistoryMixin from 'emberjs/mixins/record-history';
     import RecordOverviewMixin from 'emberjs/mixins/record-overview';
    
     export default Model.extend(
       RecordHistoryMixin,
       RecordOverviewMixin,
       {
         recordType: 'TRACKING',
       }
     );