2017-07-29 6 views
1

Je suis en train de séparer mes premiers messages de niveau aux messages sous et donc je l'ai fait:La division principale fonction de mise à jour en fonction des sous-messages

type GeneratorMsg 
    = BoidsGenerated (List Boid) 
    | ColoursGenerated (List Color) 


type Msg 
    = Tick Time 
    | UpdateWorld Window.Size 
    | GeneratorMsg 

Cependant, dans ma fonction principale de mise à jour lorsque j'utilise le BoidsGenerated message Elm pense qu'il est de type GeneratorMsg qui est correct. Dans le même temps cependant - dans mon esprit -, il est de type Msg.

Y at-il un moyen d'être en mesure de gérer Msg et GeneratorMsg interchangeable? Fondamentalement, je veux diviser ma fonction de mise à jour en fonctions plus petites, mais je veux que tout ce qui a trait aux choses générées soit géré par une fonction séparée. Alors cette fonction aura des cas pour BoidsGenerated et ColoursGenerated msgs. --- thanks

Répondre

1

Ce que vous avez ici est une collision de noms. Vous avez un type appelé GeneratorMsg ainsi qu'un constructeur appelé GeneratorMsg d'un type différent (Msg). De la manière dont vous avez défini le constructeur GeneratorMsg de Msg, il est sans paramètre et ne contient aucune information utile. Vous devez définir un paramètre pour porter la valeur GeneratorMsg:

type Msg 
    = Tick Time 
    | UpdateWorld Window.Size 
    | GeneratorMsg GeneratorMsg 

Vous pouvez ensuite gérer les mises à jour dans une fonction séparée, mais vous aurez à Cmd.map pour envelopper la GeneratorMsg en valeur Msg:

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     GeneratorMsg gmsg -> 
      let 
       (gmodel, newMsg) = 
        updateGenerator gmsg model 
      in 
       (gmodel, Cmd.map GeneratorMsg newMsg) 

     _ -> 
      ... 


updateGenerator : GeneratorMsg -> Model -> (Model, Cmd GeneratorMsg) 
updateGenerator gmsg model = 
    case gmsg of 
     BoidsGenerated boids -> 
      ... 

     ColoursGenerated colours -> 
      ...