我一直在关注这个教程:
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) }