Сообщение состояния вяза Msg
Я боролся с тем, как организовать свой код в Elm, и после некоторого поиска в Google я нашел это. Это не так уж недавно, но я попробовал это, и результат довольно хороший, по сравнению с тем, что я имел раньше. Но пытаясь применить это к моим штатам, я хочу создать пустой Cmd
просто чтобы отправить Msg
в функцию обновления "root", чтобы перейти от одного 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
, который не кажется правильным.
Другая идея состоит в том, чтобы использовать Msg как ProjectList TransitionToProjectView
и сопоставьте это сначала в функции обновления корня, хотя не уверен насчет этого в долгосрочной перспективе.
Я видел записку о Cmd.map
Док говорит, что если вам это нужно, вы, вероятно, делаете что-то не так, к сожалению, ссылка, объясняющая, что делать вместо этого, мертва. Каков был бы правильный способ либо перейти из одного состояния в другое, либо улучшить архитектуру, если все это неправильно?
1 ответ
Обычно это достигается с помощью маршрутизации. Я еще не перешел на 0,19, что немного меняет детали навигации, но основная идея в 0,19 такая же, как и в 0,18, я думаю. Либо сгенерируйте URL для вашего маршрута и создайте ссылку с этим URL, либо измените URL программно с помощью Navigation.modifyUrl
от "elm-lang/navigation" в 0.18 или Browser.Navigation.pushUrl
от elm/browser
в 0,19, которые оба возвращают Cmd msg
,
Скорее всего, вам также понадобится какая-то структура вокруг этого, основанная на пользовательских типах, чтобы получить безопасную маршрутизацию типов вместо непосредственного обращения к необработанным строковым URL-адресам.
Чтение страниц руководства по навигации и парсингу URL - хорошее начало. И смотреть, как все делается в примере Elm SPA, всегда хорошая идея.
Если по какой-то причине вы не хотите использовать маршрутизацию, сопоставление на ProjectList TransitionToProjectView
в корне функция обновления выглядит как достойный подход. В качестве альтернативы вместо переноса сообщения в родительском с помощью Html.map
Вы могли бы, чтобы родитель передал ребенку Child.Model -> Msg
функция, которую ребенок может использовать, чтобы обернуть свои сообщения самостоятельно, и, таким образом, иметь возможность напрямую использовать сообщение своих родителей.