2017-09-20 2 views
2

je les types suivants dans mon application:Le chemin Elm de drapeaux pour transformer modélise

type Page 
    = Welcome 
    | Cards 


type alias Flags = 
    { recipientName : String 
    , products : List Product 
    } 


type alias Product = 
    { id : Int 
    , name : String 
    , price : Float 
    , liked : Maybe Bool 
    } 


type alias Model = 
    { recipientName : String 
    , currentPage : Page 
    , products : List Product 
    } 

Je passe une gamme de produits comme des drapeaux. Voilà ce que mon init ressemble:

init : Flags -> (Model, Cmd Msg) 
init flags = 
    let 
     { recipientName, products } = 
      flags 
    in 
     Model recipientName Welcome products 
      |> withNoCmd 

Le défi que je suis face est que les produits de ce tableau ne sont id, name et price attributs. Ainsi, étant donné la définition Flags, chaque fois que j'étend Product avec un nouvel attribut (tel que liked), le tableau de produits transmis en tant que drapeaux doit également avoir cet attribut. Pour l'instant, je les rends simplement vides, mais cela ne me semble pas normal, alors je me demandais quelle est la méthode Elm de recevoir des drapeaux et de les transformer en modèle? Je vous remercie!

Répondre

1

Il semble que votre Product est déjà définie comme une entrée (ou l'environnement) de votre application:

type alias Product = 
    { id : Int 
    , name : String 
    , price : Float 
    } 

et vous étendez cette info qui se rapporte le bénéficiaire aux produits. Je vous suggère de diviser ceci dans son propre type qui peut se développer que votre application se développe, par exemple:

type alias Opinion = 
    { liked : Maybe Bool 
    , review : String 
    , preferredColor : Color 
    } 

alors vous pouvez lier ces ensemble dans votre Model:

type alias Model = 
    { recipientName : String 
    , currentPage : Page 
    , products : List (Product, Opinion) 
    } 

ou, selon la les travaux d'application, vous pourriez finir par vouloir regarder par product.id l'avis du bénéficiaire:

... 
    , products : List Product 
    , opinions : Dict Int Opinion 

le point est que si vous gardez lad'origineinchangé, vous pouvez construire une petite bibliothèque de fonctions qui fonctionnent sur Product, à la fois pour l'inventaire (où aucun destinataire n'est impliqué) et pour le client. Vous pouvez peut-être réutiliser le type Opinion pour les statistiques client.

Si ces deux types sont susceptibles d'évoluer, en les gardant séparés, vous pouvez vous assurer de ne pas vous retrouver avec des interdépendances désordonnées et attirantes.

+0

Merci, Conrad! Vraiment l'idée d'avoir une liste de produits, tuples Extensions! –