我正在製作一個允許選擇日期和時間的界面。所以第一件事就是將所述日期存儲在模型字段date: Date
中。比我會有例如一個DatePicker來選擇一個年 - 月 - 日的部分。對於小時和分鐘,我想我需要兩個輸入字段或選擇字段或計數器字段或任何與onInput
事件觸發器。如何更新榆樹模型中的日期字段
問題是:我如何繼續說上述事件?如果只更改小時或分鐘數,如何更新模型中的日期?
HourChange hour ->
{ model | date = ...
我正在製作一個允許選擇日期和時間的界面。所以第一件事就是將所述日期存儲在模型字段date: Date
中。比我會有例如一個DatePicker來選擇一個年 - 月 - 日的部分。對於小時和分鐘,我想我需要兩個輸入字段或選擇字段或計數器字段或任何與onInput
事件觸發器。如何更新榆樹模型中的日期字段
問題是:我如何繼續說上述事件?如果只更改小時或分鐘數,如何更新模型中的日期?
HourChange hour ->
{ model | date = ...
答案真的取決於你需要什麼樣的日期選擇器;實施一種方法有很多種。
只是作爲一個例子,這裏是你如何能充分利用HTML5的日期選擇器和timepicker(榆樹0.18):
import Html exposing (..)
import Html.Attributes exposing (type_)
import Html.Events exposing (onInput)
main =
Html.beginnerProgram
{ model = initialModel
, view = view
, update = update
}
-- MODEL
type alias Model =
{ date : String
, time : String
}
initialModel : Model
initialModel =
{ date = ""
, time = ""
}
-- UPDATE
type Msg
= ChangeDate String
| ChangeTime String
update : Msg -> Model -> Model
update msg model =
case msg of
ChangeDate newDate ->
{ model | date = newDate }
ChangeTime newTime ->
{ model | time = newTime }
-- VIEW
view : Model -> Html Msg
view model =
div []
[ input [ type_ "date", onInput ChangeDate ] []
, input [ type_ "time", onInput ChangeTime ] []
, text (toString model)
]
的事情是,這可能是也可能不是你想要的。例如,您可能需要一個更智能的日期選擇器,或者在可用性方面更好。上面的例子只是演示了一種可能的方式。
也有Elm庫可以幫助您實現您的需求。例如見elm-datepicker。
您有幾種選擇,但他們每個人都需要通過拉動每個日期部分退出當前model.date
價值構建新的Date
值。
有一個名爲rluiten/elm-date-extra的程序包,它顯示dateFromFields
函數,該函數允許您指定每個日期部分。只有
import Date exposing (..)
import Date.Extra.Create exposing (dateFromFields)
...
HourChange hour ->
{ model | date =
dateFromFields
(year model.date)
(month model.date)
(day model.date)
hour
(minute model.date)
(second model.date)
(millisecond model.date)
}
核心Date
包目前支持創建從字符串(或時間)日期:使用這個庫,你的代碼會是這個樣子。您可以通過將字符串日期連接在一起來編寫與dateFromFields
相同的函數,但只需導入該elm-date-extra軟件包可能更容易。
使用html5控件是一個好主意。但它有一個很好的方式來獲得榆木日期類型的值嗎?否則,我必須以某種方式構建一個查詢將其發送到服務器。 更新:沒關係。我發現,使用Date類型時,我將不得不以某種不明顯的方式構建查詢。 – lonelyelk
我結束了使用這個方法,因爲datepicker和timepicker都給出了一個很好的方法來構造一個字符串來使用'Date.fromString'。你甚至可以添加一個時區選擇器。 – lonelyelk