根据子消息划分主更新函数
Dividing main update function based on sub-messages
我正在尝试将我的顶级消息分离为子消息,因此我这样做了:
type GeneratorMsg
= BoidsGenerated (List Boid)
| ColoursGenerated (List Color)
type Msg
= Tick Time
| UpdateWorld Window.Size
| GeneratorMsg
然而,在我的主要更新功能中,当我使用 BoidsGenerated 消息时,Elm 认为它是 GeneratorMsg 类型,这是正确的。但与此同时 - 在我看来 - 它是 Msg 类型。
有没有办法可以交替处理 Msg 和 GeneratorMsg?基本上,我想将我的更新功能拆分为更小的功能,但我希望与生成的内容有关的所有内容都由 1 个单独的功能处理。然后该函数将包含 BoidsGenerated 和 ColoursGenerated 消息的情况。 --- 谢谢
这里是名称的冲突。您有一个名为 GeneratorMsg
的类型以及一个名为 GeneratorMsg
的不同类型 (Msg
) 的构造函数。
您定义 Msg
的 GeneratorMsg
构造函数的方式是无参数的,并且不包含信息的有效负载。需要定义一个参数携带GeneratorMsg
值:
type Msg
= Tick Time
| UpdateWorld Window.Size
| GeneratorMsg GeneratorMsg
然后您可以在单独的函数中处理更新,但您必须 Cmd.map
将 GeneratorMsg
包装成 Msg
值:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
GeneratorMsg gmsg ->
let
( gmodel, newMsg ) =
updateGenerator gmsg model
in
(gmodel, Cmd.map GeneratorMsg newMsg)
_ ->
...
updateGenerator : GeneratorMsg -> Model -> ( Model, Cmd GeneratorMsg )
updateGenerator gmsg model =
case gmsg of
BoidsGenerated boids ->
...
ColoursGenerated colours ->
...
我正在尝试将我的顶级消息分离为子消息,因此我这样做了:
type GeneratorMsg
= BoidsGenerated (List Boid)
| ColoursGenerated (List Color)
type Msg
= Tick Time
| UpdateWorld Window.Size
| GeneratorMsg
然而,在我的主要更新功能中,当我使用 BoidsGenerated 消息时,Elm 认为它是 GeneratorMsg 类型,这是正确的。但与此同时 - 在我看来 - 它是 Msg 类型。
有没有办法可以交替处理 Msg 和 GeneratorMsg?基本上,我想将我的更新功能拆分为更小的功能,但我希望与生成的内容有关的所有内容都由 1 个单独的功能处理。然后该函数将包含 BoidsGenerated 和 ColoursGenerated 消息的情况。 --- 谢谢
这里是名称的冲突。您有一个名为 GeneratorMsg
的类型以及一个名为 GeneratorMsg
的不同类型 (Msg
) 的构造函数。
您定义 Msg
的 GeneratorMsg
构造函数的方式是无参数的,并且不包含信息的有效负载。需要定义一个参数携带GeneratorMsg
值:
type Msg
= Tick Time
| UpdateWorld Window.Size
| GeneratorMsg GeneratorMsg
然后您可以在单独的函数中处理更新,但您必须 Cmd.map
将 GeneratorMsg
包装成 Msg
值:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
GeneratorMsg gmsg ->
let
( gmodel, newMsg ) =
updateGenerator gmsg model
in
(gmodel, Cmd.map GeneratorMsg newMsg)
_ ->
...
updateGenerator : GeneratorMsg -> Model -> ( Model, Cmd GeneratorMsg )
updateGenerator gmsg model =
case gmsg of
BoidsGenerated boids ->
...
ColoursGenerated colours ->
...