根据子消息划分主更新函数

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 类型。

有没有办法可以交替处理 MsgGeneratorMsg?基本上,我想将我的更新功能拆分为更小的功能,但我希望与生成的内容有关的所有内容都由 1 个单独的功能处理。然后该函数将包含 BoidsGeneratedColoursGenerated 消息的情况。 --- 谢谢

这里是名称的冲突。您有一个名为 GeneratorMsg 的类型以及一个名为 GeneratorMsg 的不同类型 (Msg) 的构造函数。

您定义 MsgGeneratorMsg 构造函数的方式是无参数的,并且不包含信息的有效负载。需要定义一个参数携带GeneratorMsg值:

type Msg
    = Tick Time
    | UpdateWorld Window.Size
    | GeneratorMsg GeneratorMsg

然后您可以在单独的函数中处理更新,但您必须 Cmd.mapGeneratorMsg 包装成 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 ->
            ...