2016-04-04 8 views
0

Es gibt HTML-Eingabe. Wir hören input-events und update model (das ist ein einfacher String hier). Jetzt möchte ich den Int-Typ für das Modell verwenden und Int vom Eingabewert analysieren. Ich machte einen anderen Decoder und änderte den Wert des ursprünglichen Modells auf 0. Nach diesen Änderungen ändert sich das Modell nicht, wenn ich Ziffern eintippe. Warum? Wie man es umsetzt?Wie Dekodierung von HTML-Eingabe zu Int in Elm?

Antwort

5

Die Json-Decodierung funktioniert nicht, da der Json-Wert eine Zeichenfolge ist, obwohl der Wert innerhalb der Zeichenfolge eine Zahl ist. Zum Beispiel sucht der Json Wert etwas wie folgt aus:

{ "target": { "value": "42" } } 

Elm Json Decodierungsfunktionen sind sehr streng, so sie gehen "42" als nur einen String zu sehen. Sie müssen einen Schritt weiter gehen, um einen Dekoder zu erstellen, der das Innere dieses Strings als Zahl analysiert - ein Vorgang, der fehlschlagen könnte, wenn der Benutzer etwas nicht-numerisches eingibt.

Dazu können wir zunächst wieder auf den Html.Events.targetValue Decoder zurückgreifen, da er den Stringwert zu dekodieren weiß. Wir geben das dann durch Json.Decode.andThen, um den Wert dieser Zeichenfolge herauszuziehen und weiter zu handeln.

decoderInt = 
    Html.Events.targetValue `Json.Decode.andThen` \str -> 
    case String.toInt str of 
     Ok i -> 
     Json.Decode.succeed i 
     Err msg -> 
     Json.Decode.fail msg 

Die Verwendung von succeed und fail gibt es den Wert wieder in die Art von Decoder Int abzubilden.