Architecture elm状态转换

Architecture elm状态转换,architecture,navigation,elm,elm-architecture,Architecture,Navigation,Elm,Elm Architecture,我一直在努力研究如何用Elm组织我的代码,经过一些谷歌搜索后,我发现。这不是最近的,但我已经尝试过了,结果非常好,与我以前的相比。但试图将其应用于我的状态时,我发现自己想要创建空的Cmd,只是为了向“root”更新函数发送Msg,以便从一个状态转换到另一个。 这似乎不对,我想我只是做错了 假设我有这个: type alias Model = { state : State } type State = StateProjectList ProjectList.Types.Model

我一直在努力研究如何用Elm组织我的代码,经过一些谷歌搜索后,我发现。这不是最近的,但我已经尝试过了,结果非常好,与我以前的相比。但试图将其应用于我的状态时,我发现自己想要创建空的
Cmd
,只是为了向“root”更新函数发送
Msg
,以便从一个
状态转换到另一个
。
这似乎不对,我想我只是做错了

假设我有这个:

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
,但它的view函数返回的是
ProjectList.Types.Msg
,而不是常规的
Msg
。我想到的一个想法是创建一个空的
Cmd
,它将使用
TransitionProjectView
调用,这似乎不正确

另一个想法是使用类似Msg的
ProjectList transitiononprojectview
,并在root update函数中匹配第一个,但不确定是否会长期使用

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

这通常是通过路由实现的。我还没有迁移到0.19,这稍微改变了导航的细节,但我认为基本思想在0.19和0.18中是一样的。为您的路线生成URL并使用该URL呈现链接,或者使用0.18中的“elm lang/Navigation”中的
Navigation.modifyUrl
或0.19中的
Browser.Navigation.pushUrl
from
elm/Browser
以编程方式修改URL,两者都返回
Cmd msg

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

阅读和上的指南页是一个良好的开端。看看这些事情是如何完成的总是一个好主意


如果出于某种原因您不想使用路由,那么在根更新函数中匹配
ProjectList transitiononprojectview
似乎是一种不错的方法。或者,不必使用
Html.map
在父级中包装消息,您可以让父级向子级传递一个
child.Model->msg
函数,子级可以使用该函数包装其消息本身,从而也可以直接使用其父级消息

我不知道导航的存在,这很好。使用Nav.load虽然有效,但使用起来有点烦人,所以我将其与您的建议结合起来,即只从所有视图返回一个根消息,效果非常好。我以为循环依赖会阻止我这么做。。我想不是。谢谢,现在它不仅工作得很好,而且我还有适当的url和历史支持作为奖励,非常高兴!