代码之家  ›  专栏  ›  技术社区  ›  Right2Drive

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

  •  2
  • Right2Drive  · 技术社区  · 9 年前

    我正在努力学习Elm,并一直在努力找出构建可扩展应用程序的最佳方法。关于布线,我想有一些简单的逻辑,根据电流呈现各种视图 route 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 回复  |  直到 9 年前
        1
  •  1
  •   ZacharyB    9 年前

    在将消息传递到编辑视图之前,可以匹配子模型的内容,并查看它是否为错误路由。所以,核心 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 将导致呈现完全不同的页面。

    推荐文章