Установите текущее время в init ELM 0.19 - PullRequest
0 голосов
/ 10 января 2019

Я получаю входные данные JSON от JS. Это простой объект, среди которого есть дата в формате «ДД.ММ.ГГГГ» - просто строка.

Если в объекте нет dateStart, я должен заменить его текущей датой (в withDefault).

paramsDecoder : Decode.Decoder Params
paramsDecoer =
    Decode.succeed Params
        |> Decode.andMap (Decode.field "dateStart" (Decode.string) |> (Decode.withDefault) "")
        |> Decode.andMap (Decode.field "dateEnd" (Decode.string)   |> (Decode.withDefault) "")
        |> Decode.andMap (Decode.field "country" (Decode.string)   |> (Decode.withDefault) "spain")

Как я могу сделать это в ELM? Часовой пояс не важен и всегда равен одному региону.

Я нашел пример использования Time.now Time.zone, но время обновляется, и уже слишком поздно.

1 Ответ

0 голосов
/ 27 января 2019

Я решил это в двух частях:

Часть 1

Отправляет текущее время в Elm при инициализации, используя флаги:

Elm.Main.init({flags: Date.now()});

И поместите это в свою модель:

import Time exposing (Posix, millisToPosix)

type alias Model = { now : Time.Posix, ... }

init : Int -> (Model, Cmd Msg)
init time = (Model (millisToPosix time), Cmd.none)

Для вашего случая использования вы можете использовать withDefault model.now.

часть 2

Решение в Часть 1 будет устанавливать now только время загрузки страницы.

Если вы хотите сохранить текущее время, вы можете использовать Time.every для обновления вашей модели:

import Time exposing (Posix, millisToPosix, every)

timeOutCheck : Sub Msg
timeOutCheck = Time.every 250 UpdateTimeNow

type Msg = UpdateTimeNow Posix | ...

update msg model = case msg of
  UpdateTimeNow time = { model | now = time }
  ...

Это гарантирует, что now никогда не будет более чем на 250 мсек позади текущего времени. Вы можете изменить 250 в соответствии с вашими потребностями.

...