2017-08-26 20 views
2

私はElmを勉強しようとしており、スケーラブルなアプリケーションを設計するための最良の方法を試しています。ルーティングに関しては、現在のrouteに応じてさまざまなビューをレンダリングするシンプルなロジックが必要です。単純なロジックを重視します。しかし、私の見解の中には、モデルに応じてルートを変更したいと思っています。たとえば、私のPlayersビューでは、サーバーからデータを受信した場合にのみレンダリングしたいと考えています。要求が保留中または失敗している場合は、エラーページを表示したいと思います。 Playersビュー内でこのロジックを実行できることは分かっていますが、メッセージをモデルに送信してルートを別のビューに変更することをお勧めします。私はイベント(onClickなど)からのメッセージをディスパッチする方法しか知りません。これは可能ですか、私は言語のデザインの外で働いていますか?elm(イベントなし)にメッセージをディスパッチする方法

これは私の現在の設定ですが、私は選手がを見るルート

コアビューを変更するメッセージ

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 

を派遣する

Nothing -> 
    notFoundView 

を変更したいです

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 

ありがとうございました!

答えて

1

メッセージを編集ビューに渡す前に、サブモデルの内容を照合してエラールートかどうかを確認することができます。したがって、コアpageの機能は次のようになります。

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 

また、完全なルートを使用し、ナビゲーションパッケージを使用することもできます。しかし、それは各ページのルートを設定するオーバーヘッドを伴います。 Cmdを送信して、アプリケーションのトップレベルのページを変更することができます。 Changing the Urlは完全に異なるページをレンダリングさせます。

+0

ありがとうございました!遅刻して申し訳ありませんが、私はこれを避けることを望んでいましたが、私はそれを回避する方法を見つけたことはありませんでした。 – Right2Drive

関連する問題