2017-06-13 2 views
0

J'ai récemment commencé avec Elm et je rencontre un problème avec la fonction de mise à jour. Mon but est de diviser mon gros fichier Main.elm en plusieurs fichiers plus petits, mais pour ce faire, j'essaie d'abord de diviser les composants principaux en composants plus petits dans le même fichier. Pour cela, je compte beaucoup sur this very informative guide.Refactoring mise à jour fuction dans une application de base Elm

Il est assez simple de diviser le modèle et init (ce que j'ai déjà fait pour DiceRoller) et c'est trivial pour la vue. Pas tellement pour la mise à jour, malheureusement.

Actuellement, il ressemble à ceci (dans la branche principale du fichier Main.elm)

type Msg = Change String 
    | Name String 
    | Password String 
    | PasswordAgain String 
    | Roll 
    | NewFace Int 
    | SearchImages 
    | NewSearchResult (Result Http.Error (List String)) 
    | ChangeTermInput String 

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     Change newContent -> 
      ({ model | content = newContent }, Cmd.none) 
     Name name -> 
      ({ model | name = name }, Cmd.none) 
     Password password -> 
      ({ model | password = password }, Cmd.none) 
     PasswordAgain password -> 
      ({ model | passwordAgain = password }, Cmd.none) 
     Roll -> 
      (model, Random.generate NewFace (Random.int 1 100)) 
     NewFace newFace -> 
      ({ model | diceRoller = { dieFace = newFace} }, Cmd.none) 
     SearchImages -> 
      (model, getSearchResult model.termInput) 
     NewSearchResult (Ok newResult) -> 
      ({ model | termResult = newResult }, Cmd.none) 
     NewSearchResult (Err _) -> 
      (model, Cmd.none) 
     ChangeTermInput term -> 
      ({ model | termInput = term}, Cmd.none) 

Et je réussi à obtenir un peu plus raffiné, mais cela ne compile pas (voir aussi this Main.elm in the refactoring branch):

Il échoue à compiler avec une incompatibilité de type sur la ligne Rôle dans updateDiceRoller, car le modèle correspond à DiceRollerMsg, mais il essaie de correspondre à Msg. Si je change juste l'entrée et les types de retour à DiceRollerMsg je reçois: Fonction updateDiceRollerCmd attend l'argument d'être: DiceRollerMsg Mais il est: Msg

Je ne pense pas non plus que Cmd.batch dans updateCmd est la meilleure solution ici.

J'apprécie n'importe quelle entrée pour faire une meilleure application d'orme, également en dehors de ces questions.

Répondre

0

Vos erreurs de compilation proviennent de l'utilisation de Msg comme valeurs d'entrée et de retour pour updateDiceRollerCmd alors que l'instruction case utilise DiceRollerMsg. Vous pouvez corriger cette fonction par correspondance de modèle et mappage vers MsgForDiceRoller.

updateDiceRollerCmd : Msg -> Cmd Msg 
updateDiceRollerCmd msg = 
    case msg of 
     MsgForDiceRoller Roll -> 
      Random.generate NewFace (Random.int 1 100) 
       |> Cmd.map MsgForDiceRoller 

     _ -> 
      Cmd.none 

Il y a une plus erreur de compilation dans votre point de vue où vous devrez changer onClick Roll-onClick (MsgForDiceRoller Rool)

+1

Wow, ils ne rigolaient pas sur l'efficacité de la communauté Elm, merci! Je n'avais aucune idée de ces cartographes et je ne m'attendais vraiment pas à ce que ce soit possible et nécessaire pour l'onclick. – mdworld