我一直在关注这个教程:
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保存在模型中.
解决方法
来自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) }