Elm 0.17 及更高版本中的键盘组合

swe*_*let 4 elm

我如何将键盘组合构建到我的 Elm 应用程序中,例如。“shift + alt + enter”?你会做这样的事情来对按下的单个键做出反应(例如输入键):

import Keyboard

type Msg
  = KeyDown Keyboard.KeyCode

type alias Model =
  ...

update msg model =
    case msg of
        KeyDown key ->
          handleKeyDown key model

subscriptions model =
    Sub.batch
        [ 
          Keyboard.downs KeyDown
        ]

handleKeyDown key model =
  case key of
    13 -> -- Enter key
      Debug.log "Other key"
      model

    _ -> -- Any other key
      Debug.log "Other key"
      model


view model =
    ...
Run Code Online (Sandbox Code Playgroud)

但是你怎么能对按下的多个键做同样的事情呢?

Cha*_*ert 5

您可以使用Keyboard.downs提到的 pdoherty926 以及 aSet来跟踪按下了哪些键。您还需要查看Keyboard.ups以了解何时释放密钥。

这是一个工作示例:

import Html exposing (..)
import Html.App exposing (program)
import Keyboard exposing (..)
import Set exposing (Set)
import Char

main =
  program { init = (initialModel, Cmd.none), view = view, update = update, subscriptions = subscriptions }

initialModel =
  { keysDown = Set.empty
  }

view : Model -> Html Msg
view model =
  text <| toString <| Set.map Char.fromCode model.keysDown

type Msg
  = KeyDown KeyCode
  | KeyUp KeyCode

type alias Model =
  { keysDown : Set KeyCode
  }

update msg model =
  case msg of
    KeyDown key ->
      ({ model | keysDown = Set.insert key model.keysDown }, Cmd.none)
    KeyUp key ->
      ({ model | keysDown = Set.remove key model.keysDown }, Cmd.none)

subscriptions _ =
    Sub.batch
        [ Keyboard.downs KeyDown
        , Keyboard.ups KeyUp
        ]
Run Code Online (Sandbox Code Playgroud)

  • 对于其他想要实现相同目标的人,我从 Alexlew 那里得到了一个关于 Slack 的好主意——归结为只添加和删除集合中的修饰键而忽略其余的。在大多数情况下,您只需要跟踪三个或四个键(ctrl、shift、alt、cmd),并且您只需要对这些特定键的设置进行任何检查。 (2认同)