独自のMsgタイプ、更新、および表示機能を持つ独立したサブモジュールにコードを分解することができます。
module SubmoduleA exposing (Model, Msg, update, view)
type Msg = SubMessageA
| SubMessageB
[..]
type alias model =
{ fieldA : TypeA
, fieldB : TypeB
, [..]
}
update msg model =
case msg of
MessageA ->
{model | fieldA = [..] } ! []
[..]
view model =
div [id "submoduleAView"]
[..]
このモジュールは、このようなあなたのメインプログラムに接続されます:あなたは、ファイルSubmoduleA.elmはこのように見えるかもしれない例えば
module Main exposing (..)
import SubmoduleA exposing (Model, Msg, update, view)
type Msg = MessageA
| MessageB
| ToSubmoduleA (SubmoduleA.Msg)
[..]
type alias model =
{ fieldA : TypeA
, fieldB : TypeB
, [..]
, subModuleA : SubmoduleA.Model
}
update msg model =
case msg of
MessageA ->
{model | fieldA = [..] } ! []
[..]
ToSubmoduleA msg =
let (newSubmoduleA, newSubmoduleACmd) = SubmoduleA.update msg (.subModuleA model)
in { model | subModuleA = newSubmoduleA } ! [Cmd.map ToSubmoduleA newSubmoduleACmd]
view model =
div [id "mainView"]
[ ..
, Html.map ToSubmoduleA <| SubmoduleA.view (.subModuleA model)
]
このようなすべての情報と、状態があなたのサブモジュールにカプセル化されたままになっていて、メッセージの正しいルーティングを担当するメインの更新関数に1つのケースがあるだけです。
Richards SPA-Realworld-Example:https://github.com/rtfeldman/elm-spa-exampleをご覧ください。彼は彼のメッセージのほとんどを単一のページに分けている。グローバルメッセージには、ログイン/ログアウト(https://github.com/rtfeldman/elm-spa-example/blob/master/src/Main.elm#L400) – hal