如何将来自不同elm功能的多种msg类型集成到顶级应用程序中

如何将来自不同elm功能的多种msg类型集成到顶级应用程序中,elm,Elm,我有一个叫做编辑器的功能,我正在尝试将它插入我的应用程序。它的视图返回一个类型为HTMLEditorMsg的字符串。我把它插在这里: edit : Editor.Types.Model -> Html EditorMsg edit editorModel = div [ class "edit" ] [ Editor.view editorModel ] 在应用程序中,我有路由,因此通过我的主视图功能调用edit,再加上几个管理显示哪个路由的功能: -- VIEW view

我有一个叫做编辑器的功能,我正在尝试将它插入我的应用程序。它的视图返回一个类型为HTMLEditorMsg的字符串。我把它插在这里:

edit : Editor.Types.Model -> Html EditorMsg
edit editorModel =
    div [ class "edit" ] [ Editor.view editorModel ]
在应用程序中,我有路由,因此通过我的主视图功能调用edit,再加上几个管理显示哪个路由的功能:

-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ RoutingMsg navBar
        , EditorMsg (render model)
        ]


render : Model -> Html EditorMsg
render model =
    case model.route of
        Nothing ->
            li [] [ text "Invalid URL" ]

        Just route ->
            showRoute route model


showRoute : Route -> Model -> Html EditorMsg
showRoute route model =
    case route of
        Home ->
            home

        Editor ->
            edit model.editor
正如您所看到的,我的视图还包含一个导航栏,它返回的Html可能包含不同类型的消息RoutingMsg:

此设置未编译,因为在视图中,我有两个不同类型的列表,一个返回Html RoutingMsg,另一个返回Html EditorMsg,因此我设置了一个联合类型以尝试包含该差异:

type Msg
    = RoutingMsg (Html RoutingMsg)
    | EditorMsg (Html EditorMsg)
这似乎是可行的,但随后我在更新方法中遇到了麻烦,匹配不太有效。长短不一的是,我觉得我刚刚弄错了图案。我的目标是让我的编辑器有点独立,就像一个模块,可以插在不同的地方。但在Elm中,我很难理解如何整合事物

为了更简单地说明这个问题,我在ellie应用程序上创建了这个示例,该示例与我尝试做但无法工作的内容近似:

我在这里的方法是否不正确,或者如果不正确,我如何才能使此代码正常工作?

您应该使用它将子消息映射到顶级消息

以下是您一直缺少的内容:

view : Model -> Html Msg
view model =
    div []
        [ Html.map ButtonDecMsg buttonDec
        , div [] [ text (toString model) ]
        , Html.map ButtonIncMsg buttonInc
        ]
此外,子更新函数的类型注释定义应包括消息类型:

buttonDecUpdate : ButtonDecMsg -> Model -> Int
buttonDecUpdate msg model =
    model - 1
下面是一个工作应用程序的示例:

您应该使用它将子消息映射到顶级消息

以下是您一直缺少的内容:

view : Model -> Html Msg
view model =
    div []
        [ Html.map ButtonDecMsg buttonDec
        , div [] [ text (toString model) ]
        , Html.map ButtonIncMsg buttonInc
        ]
此外,子更新函数的类型注释定义应包括消息类型:

buttonDecUpdate : ButtonDecMsg -> Model -> Int
buttonDecUpdate msg model =
    model - 1
下面是一个工作应用程序的示例: