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