问题描述
我正在尝试使用 Elm 制作待办事项列表,但在弄清楚如何从输入中设置值以将其添加到模型列表时遇到问题:
module TodoList exposing (..)
import browser
import Html exposing (Html,div,text,li,button,ul,input)
import Html.Events exposing (onClick)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
type alias Model = List String
type Msg =
NewTask String
init : Model
init = ["Premade Task"]
type alias AddTodo =
{ newTask : String,status: String }
update : Msg -> Model -> Model
update msg model =
case msg of
NewTask newContent ->
model ++ [newContent]
view : Model -> Html Msg
view model =
div [] [
input [ placeholder "New Task",value model.content,onInput NewTask ] [],button [ onClick <| (NewTask model.content) ] [text "Add a task"],ul [] (List.map viewTodo model)
]
viewTodo todo =
li [] [text todo]
main =
browser.sandBox { init = init,update = update,view = view }
我已经尝试将 Model 设为元组,但没有成功,实现这一点的正确方法是什么,我只需要从输入中获取值并将其添加到列表中,当我点击“添加一个任务”按钮。
解决方法
在添加到集合之前,您需要一种方法来临时存储正在键入的待办事项项。在以下示例中,我在 draft
上引入了 Model
字段。我还引入了一种新的消息类型 DraftTask
,只要用户输入,它就会被调度。当他们点击按钮时,程序会将 draft
值附加到 todos
列表中。
module ToDoList exposing (..)
import Browser
import Html exposing (Html,button,div,input,li,text,ul)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick,onInput)
type alias Model =
{ todos : List String,draft : String
}
type Msg
= NewTask
| DraftTask String
init : Model
init =
{ todos = [ "Premade Task" ],draft = ""
}
update : Msg -> Model -> Model
update msg model =
case msg of
NewTask ->
{ model
| todos = model.todos ++ [model.draft],draft = ""
}
DraftTask s ->
{ model | draft = s }
view : Model -> Html Msg
view model =
div []
[ input [ placeholder "New Task",value model.draft,onInput DraftTask ] [],button [ onClick <| NewTask ] [ text "Add a task" ],ul [] (List.map viewTodo model.todos)
]
viewTodo todo =
li [] [ text todo ]
main =
Browser.sandbox { init = init,update = update,view = view }