如何在 elm 中发送消息(没有事件)
How to dispatch a message in elm (without an event)
我正在努力学习 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
提前感谢您的帮助!
在将消息向下传递到编辑视图之前,可以匹配子模型的内容并查看它是否是错误路由。所以,核心 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 然后会导致呈现完全不同的页面。
我正在努力学习 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
提前感谢您的帮助!
在将消息向下传递到编辑视图之前,可以匹配子模型的内容并查看它是否是错误路由。所以,核心 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 然后会导致呈现完全不同的页面。