如何在elm中发送消息(没有事件)

时间:2017-08-26 02:06:04

标签: web routing frontend elm messages

我正在努力学习Elm,并一直在努力找出构建可扩展应用程序的最佳方法。关于路由,我希望有一些简单的逻辑,根据当前route呈现各种视图,强调简单的逻辑。但是,在我的一些观点中,我想根据模型改变路线。例如,在我的Players视图中,如果我从服务器收到一些数据,我只想渲染它。如果请求未决或失败,我想显示错误页面。我意识到我可以在Players视图中执行此逻辑,但我更愿意向模型发送消息以将路由更改为其他视图。我只知道如何从事件(onClick等)发送消息。这是可能的还是我在语言设计之外工作?

这是我目前的设置,但我想改变

Nothing ->
    notFoundView

发送更改路径的消息

核心视图

view : Model -> Html Msg
view model =
    div []
        [ page model
        ]

page : Model -> Html Msg
page model =
    case model.route of
        PlayersRoute ->
            listView model.playersModel.players

        PlayerRoute id ->
            editView model id

        NotFoundRoute ->
            notFoundView

玩家视图

editView : Model -> PlayerId -> Html Msg
editView model id =
    case model.playersModel.players of
        NotAsked ->
            text ""

        Loading ->
            text "Loading ..."

        Failure err ->
            text (toString err)

        Success players ->
            let
                maybePlayer =
                    players
                        |> List.filter(\player -> player.id == id)
                        |> List.head
            in
                case maybePlayer of
                    Just player ->
                        core player

                    Nothing ->
                        notFoundView

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在将消息传递到编辑视图之前,可以匹配子模型的内容并查看它是否是错误路径。因此,核心page函数看起来像这样。

page : Model -> Html Msg
page model =
    case model.route of
        PlayersRoute ->
            listView model.playersModel.players

        PlayerRoute id ->
            case model.playersModel.players of
                Failure err ->
                    errorView err

                _ ->
                    editView model id

        NotFoundRoute ->
            notFoundView

另一种选择是使用完整路线,并使用导航包。但是,这将涉及为每个页面设置路由的开销。您可以发送Cmd来更改应用程序顶层的页面。然后Changing the Url会导致呈现完全不同的页面。