如何使用 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 次 |
| 最近记录: |