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

问题描述:

我正在尝试学习榆树,并一直试图找出构建可伸缩应用程序的最佳方法。关于路由,我想有一些简单的逻辑,根据当前的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然后会导致完全不同的页面被渲染。

+0

谢谢!抱歉,迟到的回应,我希望避免这种情况,但我从来没有找到解决办法,所以这是我见过的最好的折中方案 – Right2Drive