2017-04-11 4 views
2

Je suis passé à un projet Redux + Immutable JS d'Ember il y a quelques mois et je profite de l'expérience.Où stocker les méta-données d'enregistrement avec Redux et Immutable JS

Un problème I encore n'a pas trouvé une solution intéressante lorsque vous travaillez avec Records stocke des métadonnées pour cet enregistrement.

Par exemple, disons que j'ai un User enregistrement:

const userRecord = Immutable.Record({ 
    id: null, 
    name: '', 
    email: '' 
}); 

Pour le User, je souhaite également stocker des propriétés telles que isLoading ou isSaved. La première solution serait de stocker ceux-ci dans le userRecord. Bien que ce soit la solution la plus facile de loin, cela me semble faux.

Une autre solution pourrait être de créer une carte User, qui contient l'enregistrement User, ainsi que des métadonnées sur l'utilisateur.

Ex.

const userMap = Immutable.Map({ 
    record: Immutable.Record({ 
     id: null, 
     name: '', 
     email: '' 
    }), 
    isLoading: false, 
    isSaved: true 
}); 

Je pense que cela est plus élégant, mais je n'aime pas comment toutes les propriétés de l'utilisateur deviennent encore plus profondément imbriquées, afin d'accéder aux propriétés de l'utilisateur devient très bavard. Ce qui me manque le plus chez Ember, c'est de pouvoir accéder facilement aux propriétés du modèle.

Ex. user.get('isSaved') ou user.get('name')

Est-il possible de recréer quelque chose comme ça avec Redux et Immutable? Comment avez-vous abordé cette situation avant?

Répondre

2

je pourrais être mal compris le problème, parce que

Ce qui me manque le plus Ember est de pouvoir accéder aux propriétés de modèle facilement.

user.get ('isSaved') ou user.get ('name')

Ce ne travail pour les dossiers Immuable.

Si vous ne voulez pas ajouter trop de propriétés à votre dossier, vous pourriez avoir une seule propriété d'état et ajouter quelques getters (en supposant que vos statuts sont mutuellement exclusifs):

const STATUS = { 
    INITIAL: 'INITIAL', 
    LOADING: 'LOADING', 
    SAVING: 'SAVING 
}; 

class UserRecord extends Immutable.Record({ 
    id: null, 
    name: '', 
    email: '', 
    status: STATUS.INITIAL}) { 

    isLoading() { 
    return this.get('status') === STATUS.LOADING; 
    } 

    isSaving() { 
    return this.get('status') === STATUS.SAVING; 
    } 
} 

new UserRecord().isLoading()); // returns false 

new UserRecord({status: STATUS.LOADING}).isLoading(); // returns true 
new UserRecord().set('status', STATUS.LOADING).isLoading(); // returns true 
+0

_exactement_ ce que je recherchais pour. Je vous remercie! –