【问题标题】:Initialize model with current date用当前日期初始化模型
【发布时间】:2015-12-20 11:26:52
【问题描述】:

我正在尝试使用当前日期初始化我的模型。我不想使用本机模块。我正在尝试使用任务和效果来做到这一点。我被我的getCurrentTime 方法困住了。最干净的方法是什么?

import Time exposing ( Time )
import StartApp
import Task
import Effects exposing (Never)
import Html exposing ( Html )

app = 
  StartApp.start
    { init = init
    , view = view
    , update = update
    , inputs = []}

main = 
  app.html

port tasks : Signal (Task.Task Never ())
port tasks =
  app.tasks

type alias Model = 
    { clock : Time}

init : (Model, Effects.Effects Action)
init = ((Model  ), Effects.none)

type Action = ShowClock 

update : Action -> Model -> (Model, Effects.Effects Action)
update action model = 
  case action of
    ShowClock c -> 
      ({ model | clock = c}, Effects.none)

getCurrentTime : Effects.Effects Action
getCurrentTime =
  -- stuck here
  |> Task.map ShowClock
  |> Effects.task

view : Signal.Address Action -> Model -> Html
view address model =
  Signal.map Html.text model.clock

将时间转换为“YYYY-MM-DD”格式的字符串也不错。

【问题讨论】:

    标签: date time elm


    【解决方案1】:

    http://package.elm-lang.org/packages/evancz/task-tutorial/1.0.3/TaskTutorial 提供了一个 ELM 包,您可以使用它来获取当前时间。

    首先,您需要在终端或 Windows 命令中使用以下命令下载并更新您的 elm-package.json 文件:

    elm-package install evancz/task-tutorial 1.0.3
    

    然后更新您的代码:

    getCurrentTime : Effects.Effects Action
    getCurrentTime = Effects.task <| Task.map ShowClock ( TaskTutorial.getCurrentTime )
    

    最后,您只需将 getCurrentTime 作为一个 Effects Action 调用,您的模型就会更新。

    要将您的时间转换为人类可读的日期字符串,您可以使用这个小辅助函数:

     toHRDate : Time -> String -- to human readable date
     toHRDate t =
         let
           date = Date.fromTime t
           d = toString (Date.day date) -- day
           m = toString (Date.month date) -- month
           y = toString (Date.year date) -- year
           hrd = d ++ "-" ++ m ++ "-" ++ y
        in hrd
    

    【讨论】:

      【解决方案2】:

      如果我们只是想在程序开始时传递一个初始值,我们可以使用端口:

      因此,我们将其添加到包含 main 的应用程序中:

      port time : Float
      

      ...然后我们必须将以下内容添加到我们的 html 中,以便为我们的 elm 程序提供正确的初始值。

      var myapp = Elm.fullscreen(Elm.YourAppNameHere, 
                                 {
                                     time: Date.now()
                                 });
      

      elm 语言网站上的互操作文档合理地涵盖了这一点,并提供了其他几个示例的链接:http://elm-lang.org/guide/interop

      或者,您可以尝试 Signal.Extra 库中的 foldp',它更明确地公开初始值。 http://package.elm-lang.org/packages/Apanatshka/elm-signal-extra/5.7.0

      【讨论】:

      • html 部分让我感到困惑,因为我在 ELM 中使用 view 方法编写 html。我该怎么做?
      • 这个要点:gist.github.com/evancz/8456627 从互操作页面链接到,并解释了如何在 html 中嵌入 elm(全屏功能的行为类似于 embed,只是它不需要目标元素,因为它将整个页面用作榆树应用程序)
      • 我不想在 html 中嵌入榆树。一定有别的办法,我会继续寻找。 :)
      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2011-03-26
      • 2017-09-16
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多