榆树状态转换消息

时间:2018-09-24 11:02:26

标签: architecture navigation elm elm-architecture

我一直在努力如何在Elm中组织代码,经过一番搜寻之后,我发现了this。这不是最近的事,但是我已经尝试过了,与以前相比,结果非常好。但是尝试将此应用于我的状态时,我发现自己想要创建空的Cmd只是为了向{root}更新函数发送Msg,从一个State过渡到另一个。 这似乎不对,我认为我做错了。

所以说我有这个:

type alias Model =
  { state : State
  }

type State = StateProjectList ProjectList.Types.Model
           | StateProjectView ProjectView.Types.Model

type Msg = ProjectList ProjectList.Types.Msg
         | ProjectView ProjectView.Types.Msg
         | TransitionProjectView Project

当我进入StateProjectList时,我需要能够以某种方式过渡到StateProjectView,但是它的视图函数返回一个ProjectList.Types.Msg而不是常规的Msg。我想到的一个想法是创建一个空的Cmd,它将使用TransitionProjectView进行回调,这似乎不正确。

另一个想法是使用ProjectList TransitionToProjectView之类的Msg,并在根更新功能中首先将其匹配,尽管不确定该期限是否长。

我确实在Cmd.map的文档上看到了注释,说如果您需要这样做,可能是您做错了什么,不幸的是,解释该怎​​么做的链接已失效。 如果整个事情都不对,从一种状态过渡到另一种状态或更好的体系结构的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

通常使用路由来完成。我还没有迁移到0.19,这会稍微改变导航的细节,但是我认为0.19中的基本思想与0.18中的基本思想相同。要么为您的路线生成URL并使用该URL呈现链接,要么通过使用0.18中“ elm-lang / navigation”中的Navigation.modifyUrl或2000中Browser.Navigation.pushUrl中的elm/browser以编程方式修改URL 0.19,它们都返回Cmd msg

您还很可能需要基于自定义类型的某种框架,以便获得类型安全的路由,而不是直接处理原始字符串URL。

阅读NavigationURL Parsing上的指南页是一个好的开始。在Elm SPA example中查看事情的完成方式总是一个好主意。

如果由于某些原因您不想使用路由,则在根更新功能中对ProjectList TransitionToProjectView进行匹配似乎是一种不错的方法。另外,也可以让父母为孩子传递一个Html.map函数,孩子可以使用该函数自己包装消息,从而可以使用其父母,而不是使用Child.Model -> Msg将消息包装在父母中。直接发送消息。