扩展Elm教程表单应用程序以包含编号输入Age

我一直在关注这个教程: http://guide.elm-lang.org/architecture/user_input/forms.html

那里的文字我有意义,我的问题与它在页面底部列出的练习有关.它问我:

“Add an additional field for age and check that it is a number.”

我对此有困难,因为onInput函数似乎只接受String输入.我觉得奇怪的是没有等效的type =“number”输入.

然而,这是我的尝试不起作用:

import Html exposing (..)
import Html.App as Html
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
import String exposing (length)

main =
  Html.beginnerProgram { model = model,view = view,update = update }


-- MODEL

type alias Model =
  { name : String,password : String,passwordAgain : String,age : Int
  }


model : Model
model =
  Model "" "" "" 0


-- UPDATE

type Msg
    = Name String
    | Password String
    | PasswordAgain String
    | Age Int

update : Msg -> Model -> Model
update msg model =
  case msg of
    Name name ->
      { model | name = name }

    Password password ->
      { model | password = password }

    PasswordAgain password ->
      { model | passwordAgain = password }

    Age age ->
      { model | age = age }      


-- VIEW

view : Model -> Html Msg
view model =
  div []
    [ input [ type' "text",placeholder "Name",onInput Name ] [],input [ type' "password",placeholder "Password",onInput Password ] [],placeholder "Re-enter Password",onInput PasswordAgain ] [],input [ type' "number",placeholder "Age",onInput Age ] [],viewValidation model
    ]

viewValidation : Model -> Html msg
viewValidation model =
  let
    (color,message) =
      if model.password /= model.passwordAgain then
        ("red","Passwords do not match!")
      else if length model.password <= 8 then
        ("red","Password must be more than 8 characters!")
      else
        ("green","OK")
  in
    div [ style [("color",color)] ] [ text message ]

我得到的错误如下:

-- TYPE MISMATCH ----------------------------------------------------- forms.elm

The argument to function `onInput` is causing a mismatch.

58|                                                  onInput Age 
                                                             ^^^
Function `onInput` is expecting the argument to be:

    String -> a

But it is:

    Int -> Msg

注意:我知道我可以创建Age输入作为另一个文本输入,但练习特别要求我检查它是一个`数字类型.我认为这意味着我应该将它作为Int保存在模型中.

我很清楚错误是什么.我只是想知道在Elm中解决这个问题的惯用方法.谢谢.

解决方法

来自onInput事件的任何用户输入都是String.

您的模型期望它是一个Int

使用String.toInt从字符串值中解析整数值.

调整更新功能以将类型转换为Int并将类型签名更改为Age String

Age age ->
    case String.toInt age of
        Ok val ->
            { model | age = val }

        -- Notify the user,or simply ignore the value
        Err err ->
            model

这样您就可以选择通知用户有关错误的信息.

如果Maybe值更适合你,整个语句可以简化为:

Age age ->
    { model | age =  Result.toMaybe (String.toInt age) }

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些