You add two onkeydown attributes to the input element, and only one of them can win. The second on the list overwrites the first. If he used addEventListener behind the scenes, that would not be so, but now we can solve it a little differently.
You can write an onKeysDown function that accepts a list of possible key codes and a message that they should call as follows:
onKeysDown : List (Int, Msg) -> Attribute Msg onKeysDown keys = let captureKey code = List.filterMap (\(k, m) -> if k == code then Just m else Nothing) keys |> List.head |> Maybe.withDefault NoOp in on "keydown" (Json.map captureKey keyCode)
Then you can write shortened functions to handle certain keys, for example:
enter msg = (13, msg) esc msg = (27, msg)
And now you can use it in your view as follows:
input [ ... , onKeysDown [ enter <| SwitchEditTodo item.uid False , esc <| UndoEditTodo item.uid ] ]
This works because it generates a single keydown event handler attribute. And while you are replacing a predefined tuple for a higher order function, it still gives you the same readable code.
Chad gilbert
source share