Как тип `Msg` может быть разделен на множество типов в Elm? - PullRequest
0 голосов
/ 09 мая 2018

Стандартный способ использования модели и обновления в Elm - определить типы Model и Msg и функцию обновления:

type alias Model = { ... }

type Msg = Msg1 | Msg2 | ...

update : Msg -> Model -> (Model, Cmd Msg)
...

Когда приложение растет, все эти типы и функции становятся более сложными. Я бы хотел разделить их следующим образом:

type alias Model1 = { ... }
type alias Model2 = { ... }
type alias Model = { model1 : Model1, model2 : Model2 }

type Msg1 = Msg1a | Msg1b | ...
type Msg2 = Msg2a | Msg2b | ...
type Msg = M1 Msg1 | M2 Msg2 | ...

Тогда я бы хотел обрабатывать их все по отдельности (и я знаю, как это сделать).

У меня проблема с функцией просмотра. Я определяю свою точку зрения следующим образом:

view : Model -> Html Msg
view model =
  let v1 = view1 model.model1
      ...
  in ...

view1 : Model1 -> Html Msg1
view1 model = ...

Проблема в том, что результат view1 равен Html Msg1, а функция вида нуждается в Html Msg.

Есть ли способ преобразовать результат из Html Msg1 в Html Msg?

1 Ответ

0 голосов
/ 09 мая 2018

Вы ищете Html.map:

view : Model -> Html Msg
view model =
  let v1 = view1 model.model1 |> Html.map M1
      v2 = view2 model.model2 |> Html.map M2
  in ...
...