如何使用 ELM 0.19.1 执行一个函数来获取 4 位数字的当前年份?我读过一些东西,但在 0.19.1 上没有任何效果。
签名:
getCurrentYear : Int
Run Code Online (Sandbox Code Playgroud)
执行:
getCurrentYear => 2020
Run Code Online (Sandbox Code Playgroud)
编辑:
也许执行new Date().getFullYear()
javascript代码?
最简单的方法是在启动应用程序时通过标志传递年份,因为当前年份在应用程序运行过程中不太可能改变。在这种情况下,您可以使用您建议的 JavaScript 片段(ellie 示例):
Elm.Main.init({
node: document.querySelector('main'),
flags: {
year: new Date().getFullYear(),
}
});
Run Code Online (Sandbox Code Playgroud)
module Main exposing (main)
import Browser
import Html exposing (Html, p, text)
type alias Flags =
{ year : Int }
main : Program Flags Model Msg
main =
Browser.element
{ init = \flags -> ( Model flags.year, Cmd.none )
, view = view
, update = update
, subscriptions = \_ -> Sub.none
}
type alias Model =
{ year : Int }
type Msg
= NoOp
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
( model, Cmd.none )
view : Model -> Html Msg
view model =
p [] [ text "The year is ", text (String.fromInt model.year) ]
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Time.now
请求当前时间,正如Robin Zigmond 的回答所暗示的那样,但这是指向 Elm 0.18 文档(用于elm-lang/core而不是elm/time)。对于 0.19,您需要 aTime.Posix
和 aTime.Zone
才能调用Time.toYear
. 您可以链接Time.now
(aTask
产生Posix
值)和Time.here
(aTask
产生Zone
具有当前时区偏移量的a)以在 one 中检索这些值Cmd
。这是一个例子(也在 ellie 上)
module Main exposing (main)
import Browser
import Html exposing (Html, p, text)
import Task exposing (Task)
import Time
type alias Flags =
{ year : Int }
main : Program () Model Msg
main =
Browser.element
{ init = \() -> ( Model 0, whatYearIsIt |> Task.perform GotYear )
, view = view
, update = update
, subscriptions = \_ -> Sub.none
}
whatYearIsIt : Task x Int
whatYearIsIt =
Task.map2 Time.toYear Time.here Time.now
type alias Model =
{ year : Int }
type Msg
= GotYear Int
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
GotYear year ->
( { model | year = year }, Cmd.none )
view : Model -> Html Msg
view model =
p [] [ text "The year is ", text (String.fromInt model.year) ]
Run Code Online (Sandbox Code Playgroud)
正如我在评论中已经说过的,在 Elm 中定义一个返回当前年份的函数是不可能的。您必须从 Elm 运行时系统(基本上是 JavaScript,但您不必自己编写)获取此类信息。这通过命令发生,您可以在其中告诉运行时系统为您做一些事情。但请注意,您不能简单地检索该命令的“返回值”并将其返回到您的 Elm 代码中。相反,您必须将其传递给一个可以将其转换为“消息”的函数(请参阅此处的基本 Elm 架构教程,在您可以使用 Elm 执行任何操作之前,了解这一点很重要)- 这样您就可以将值存储在您的建模,从而在您的应用程序中显示它。
这些模式确实需要一些理解,特别是如果你不习惯纯函数式编程——但是一旦你习惯了它,好处是巨大的,包括几乎保证没有运行时错误,以及大大增强的推理能力你的代码。
为了具体获取年份,看起来您需要这个库,它为您提供 (as now
) aTask
而不是Cmd
. 您可以使用Task.perform
将其转换为命令,该命令记录在此处- 事实上,它甚至提供了一个与您的用例非常匹配的示例 - 我将在此处复制它以供后代使用:
import Time -- elm install elm/time
import Task
type Msg
= Click
| Search String
| NewTime Time.Posix
getNewTime : Cmd Msg
getNewTime =
Task.perform NewTime Time.now
Run Code Online (Sandbox Code Playgroud)
您必须填写它以适合您自己的用例,尤其是您自己的Msg
类型。但它给出了一个很好的基本轮廓。要获取用户的当前年份,您需要将Time.Posix
类型替换为Int
,并将Time.now
命令替换为(Task.map2 Time.toYear Time.here Time.now)
,正如@bdukes 在他的回答中所解释的那样。
归档时间: |
|
查看次数: |
187 次 |
最近记录: |