2017-12-14 31 views
1

인 onInput을 onInput 형식으로 만들고 내 모델의 유형이 String 인 경우 잘 작동합니다. 내가 원하는 경우 사용자가 Int onInput 나에게 다음과 같은 오류 제공 입력합니다 :Elm은 번호가

Function `onInput` is expecting the argument to be: 
     String -> msg 
    But it is: 
     Int -> Msg 

view : Model -> Html Msg 
view model = 
    div [] 
     [ input [type_ "text", placeholder "Id", onInput Msgs.NewPlayerId] [] 
     , input [type_ "text", placeholder "Name", onInput Msgs.NewPlayerName ] [] 
     , input [type_ "number", placeholder "Level", onInput Msgs.NewPlayerLevel ] [] 
     , button [ onClick Msgs.Submit ] [ text "submit" ] 
     ] 

아래에있는 내 코드가이됩니다의 int 또는 수레를 받아 onInput의 변화에 ​​내장?

type Msg 
    = ... 
    | NewPlayerLevel (Result String Int) 

하고 onInput 호출은 다음과 같습니다 : 당신은 플레이어가 숫자가 아닌 뭔가를 입력 할 수 있다는 사실을 설명하기 위해 Result String Int을 받아 Msgs.NewPlayerLevel를 재정의하는 경우

답변

5

, 당신이 할 수

onInput (NewPlayerLevel << String.toInt) 

String.toFloat도 마찬가지입니다. 당신은 당신이 제공하는 솔루션 옆에이

type alias Model = 
    { ... 
    , level : Maybe Int 
    , levelError : Maybe String 
    } 
1

같은 모델이 가정 새 메시지 유형

update msg model = 
    case msg of 
    ... 

    NewPlayerLevel (Ok level) -> 
     { model | level = Just level, levelError = Nothing } 

    NewPlayerLevel (Err err) -> 
     { model | level = Nothing, levelError = Just err } 

OkErr 경우 모두를 처리 할 update 기능에

@ chad-gilbert를 사용하면 결과에 따라 다른 Msg을 보내는 String -> Msg 함수를 제공 할 수도 있습니다. 예를 들어 :

type Msg 
    = ... 
    | NewPlayerLevel Int 
    | IncorrectInput String 

newPlayerLevelInput : String -> Msg 
newPlayerLevelInput input = 
    case String.toInt input of 
     Ok int -> NewPlayerLevel int 
     Err error -> IncorrectInput error 

당신의 input 기능에서 당신은 속성으로 onInput newPlayerLevelInput을 사용합니다.