сообщение состояния вяза Msg - PullRequest
       29

сообщение состояния вяза Msg

0 голосов
/ 24 сентября 2018

Я боролся с тем, как организовать свой код в 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 голосов
/ 24 сентября 2018

Обычно это выполняется с помощью маршрутизации.Я еще не перешел на 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 в обновлении rootФункция выглядит как достойный подход.В качестве альтернативы, вместо того, чтобы обернуть сообщение в родительский элемент с помощью Html.map, вы можете сделать так, чтобы родитель передал дочернему элементу функцию Child.Model -> Msg, которую дочерний элемент может использовать, чтобы обернуть свои сообщения самостоятельно, и, таким образом, иметь возможность напрямую использовать сообщение своих родителей.,

...