我一直在努力如何在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
的文档上看到了注释,说如果您需要这样做,可能是您做错了什么,不幸的是,解释该怎么做的链接已失效。
如果整个事情都不对,从一种状态过渡到另一种状态或更好的体系结构的正确方法是什么?
答案 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。
阅读Navigation和URL Parsing上的指南页是一个好的开始。在Elm SPA example中查看事情的完成方式总是一个好主意。
如果由于某些原因您不想使用路由,则在根更新功能中对ProjectList TransitionToProjectView
进行匹配似乎是一种不错的方法。另外,也可以让父母为孩子传递一个Html.map
函数,孩子可以使用该函数自己包装消息,从而可以使用其父母,而不是使用Child.Model -> Msg
将消息包装在父母中。直接发送消息。