2017-08-26 13 views
2

J'essaie d'apprendre Elm, et j'ai essayé de trouver la meilleure façon d'architecturer une application évolutive. En ce qui concerne le routage, je veux avoir une logique simple rendant les différentes vues en fonction du courant route, en mettant l'accent sur la logique simple. Cependant, à l'intérieur de certaines de mes vues, je veux changer l'itinéraire en fonction du modèle. Par exemple, dans ma vue Players, je veux seulement le rendre si j'ai reçu des données du serveur. Si la demande est en attente ou a échoué, je voudrais afficher une page d'erreur. Je réalise que je pourrais exécuter cette logique à l'intérieur de la vue Players, mais je préférerais envoyer un message au modèle pour changer l'itinéraire à une vue différente. Je sais seulement comment envoyer des messages d'événements (onClick, etc ...). Est-ce possible ou est-ce que je travaille en dehors des conceptions de la langue?Comment envoyer un message en elm (sans un événement)

Ceci est ma configuration actuelle, mais je voudrais changer

Nothing -> 
    notFoundView 

Pour envoyer un message qui change la route

base Voir

view : Model -> Html Msg 
view model = 
    div [] 
     [ page model 
     ] 

page : Model -> Html Msg 
page model = 
    case model.route of 
     PlayersRoute -> 
      listView model.playersModel.players 

     PlayerRoute id -> 
      editView model id 

     NotFoundRoute -> 
      notFoundView 

Joueurs Voir

editView : Model -> PlayerId -> Html Msg 
editView model id = 
    case model.playersModel.players of 
     NotAsked -> 
      text "" 

     Loading -> 
      text "Loading ..." 

     Failure err -> 
      text (toString err) 

     Success players -> 
      let 
       maybePlayer = 
        players 
         |> List.filter(\player -> player.id == id) 
         |> List.head 
      in 
       case maybePlayer of 
        Just player -> 
         core player 

        Nothing -> 
         notFoundView 

Merci d'avance pour toute aide!

Répondre

1

Il est possible de faire correspondre le contenu des sous-modèles et de voir s'il s'agit d'une route d'erreur avant de transmettre le message à la vue d'édition. Ainsi, la fonction de base page ressemblerait à ceci.

page : Model -> Html Msg 
page model = 
    case model.route of 
     PlayersRoute -> 
      listView model.playersModel.players 

     PlayerRoute id -> 
      case model.playersModel.players of 
       Failure err -> 
        errorView err 

       _ -> 
        editView model id 

     NotFoundRoute -> 
      notFoundView 

Une autre option serait d'utiliser des routes complètes et d'utiliser le package Navigation. Mais, cela impliquerait la surcharge de la mise en place des routes pour chaque page. Vous seriez en mesure d'envoyer un Cmd pour changer la page au plus haut niveau de l'application. Changing the Url entraînerait alors une page complètement différente à rendre.

+0

Merci! Désolé pour la réponse tardive, j'espérais éviter cela mais je n'ai jamais trouvé de solution, donc c'est le meilleur compromis que j'ai vu – Right2Drive