我有一个带有多个页面和路线的elm 0.18网络应用程序。在main.elm
我定义了我的更新功能。
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
FirstUpdateAction ->
...
每一个动作都经过这个功能而且变得越来越大。是否可以为嵌套在整体结构中的较小模块创建更新功能?
例如,我有一个设置页面,可让用户更改密码。有三个字段/状态(passwordOld,passwordNew,passwordConfirm),它们具有与onInput
和onBlur
事件关联的更新操作。这些状态和操作仅与用户设置页面相关,并在用户离开页面时对模型的其余部分无效。
我如何设置用户设置的范围?
答案 0 :(得分:2)
您可以将代码分解为独立的子模块,每个子模块都有自己的Msg类型,更新和查看功能。
例如,您可以将文件SubmoduleA.elm看起来像这样:
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"]
[..]
此模块将连接到您的主程序,如下所示:
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)
]
这样,与子模块相关的所有信息和状态都保存在子模块中,并且主要更新功能中只有一个案例负责正确的消息路由。